DecimalFormat - keep all decimal numbers

decimalformat, java, numbers

Solution

String.format might help you out here - NumberFormat

  private static void printfWithLocale(Locale locale, Double d){
    System.out.println("Output locale: " + locale.toString());
    String simpleOutputTeplate = "simpleOutputTeplate: %s";
    String refinedOutputTeplate = "refinedOutputTeplate: %.10f";

    System.out.println(String.format(locale, simpleOutputTeplate, d));
    System.out.println(String.format(locale, refinedOutputTeplate, d));

  }

  public static void main(String[] args) {

    Double d = new Double(3.1234567890123456789);

    printfWithLocale(Locale.US, d);
    System.out.println("");
    printfWithLocale(Locale.FRANCE, d);
  }

Code output:

Output locale: en_US
simpleOutputTeplate: 3.1234567890123457
refinedOutputTeplate: 3.1234567890

Output locale: fr_FR
simpleOutputTeplate: 3.1234567890123457
refinedOutputTeplate: 3,1234567890

You will notice that the %s (string) does not conform to the Locale, but does format the Double up to 17 decimal points. With String.format you can further refine the way your numbers are formatted in a string.

Problem

I'm using DecimalFormat to format doubles into a String. This String is then integrated into my presentation layer. - Problem: I want to keep ALL decimals. Example: "12345678.123456789" - Question: What format should I use? - Remark: I use a different Locale to support multiple layouts. Format: #.## -> This uses ALL numbers BEFORE the decimal, but ROUNDS the numbers AFTER the decimal. I could use #.######### for the big decimal, but what if the decimal is even longer? I found my small test program useful and want to share it with you. Can you help me to show ALL decimals? ``` package be.softwarelab.numbers; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; public class DecimalNumbersTest { private static final double NUMBER = 123456789.123456789; public static void main(String[] args) { String format01 = "#."; String format02 = "#.#"; String format03 = "#.##"; String format04 = "#.###"; String format05 = "#.####"; System.out.println("====== NUMBER ===== USA ====================================="); showResult(NUMBER, format01, Locale.US); showResult(NUMBER, format02, Locale.US); showResult(NUMBER, format03, Locale.US); showResult(NUMBER, format04, Locale.US); showResult(NUMBER, format05, Locale.US); System.out.println("====== NUMBER ===== France =================================="); showResult(NUMBER, format01, Locale.FRANCE); showResult(NUMBER, format02, Locale.FRANCE); showResult(NUMBER, format03, Locale.FRANCE); showResult(NUMBER, format04, Locale.FRANCE); showResult(NUMBER, format05, Locale.FRANCE); System.out.println("============================================================="); } public static void showResult(double number, String format, Locale locale) { // Using a Locale to see the differences between regions. DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(locale); DecimalFormat formatter = new DecimalFormat (format, otherSymbols); // Create the String result String output = formatter.format(number); // Format the output for a nice presentation. System.out.format(" %s %11s = %20s\n", locale, format, output); } } ``` This results in: ``` ====== NUMBER ===== USA ===================================== en_US #. = 123456789. en_US #.# = 123456789.1 en_US #.## = 123456789.12 en_US #.### = 123456789.123 en_US #.#### = 123456789.1235 ====== NUMBER ===== France ================================== fr_FR #. = 123456789, fr_FR #.# = 123456789,1 fr_FR #.## = 123456789,12 fr_FR #.### = 123456789,123 fr_FR #.#### = 123456789,1235 ============================================================= ``` Edit: One user mentioned a related question: How to nicely format floating numbers to String without unnecessary decimal 0? This question does not solve my problems, since it focuses on limiting the size, but I need to keep it as long as possible.

Original source

Related problems