Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DecimalFormat - keep all decimal numbers

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.

like image 783
Dimitri Dewaele Avatar asked Oct 28 '16 11:10

Dimitri Dewaele


People also ask

How do you control decimal places in Java?

To use Java printf to format double and float values with decimal place precision, follow these two rules: Use %f as the double specifier in the text string. Precede the letter f with a decimal and number to specify precision.

Is decimal format thread safe?

DecimalFormat isn't thread-safe, thus we should pay special attention when sharing the same instance between threads.

How do you format a decimal?

Creating a DecimalFormat instance is done like this: String pattern = "###,###. ###"; DecimalFormat decimalFormat = new DecimalFormat(pattern); The pattern parameter passed to the DecimalFormat constructor is the number pattern that numbers should be formatted according to.


1 Answers

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.

like image 129
Viorel Florian Avatar answered Sep 27 '22 00:09

Viorel Florian