Wie formatiert man eine Dezimalzahl?

Die Ausgabe eines Gleitkommawertes in Java (32 bit-float, 64 bit double) entspricht üblicherweise dem jeweiligen Genauigkeisumfang. Eine Formatierung, etwa im Sinne einer Begrenzung der Nachkommastellen oder des Tausender-Trenners, muss bei der String-Repräsentation des Wertes erfolgen, kann jedoch bei Bedarf anschließend ggf. auch wieder in die dann bei beschnittenen Nachkommastellen etwas ungenauere Variante gewandelt werden.

Die Klasse DecimalFormatter erweitert die Klasse NumberFormatter und stellt zusätzliche Funktion zur Formatierung von Dezimalzahlen bereit.
Dem Konstruktor kann ein Formatierungspattern als String übergeben werden, das das Ausgabeformat in vielfältiger Weise bestimmen kann. Zur Formatierung sind insbesondere 4 Zeichen von Bedeutung:

0 steht für eine auf jeden Fall anzuzeigende Ziffer innerhalb der darzustellenden Zahl; ist die Stelle leer, wird eine '0' dargestellt
# steht für eine Ziffer innerhalb der darzustellenden Zahl; ist die Stelle leer, wird nichts dargestellt
. steht für den Dezimaltrenner; sein Format richtet sich in der Standardeinstellung nach den lokalen Systemeinstellungen
, Tausendertrenner, genauer: gruppiert die Ziffern zwischen ',' und '.'

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class ZahlenFormatieren {

    public static void main(String[] args) {
        // Formatierung mit Dezimal-Komma
        double bigD = (double)1537959.274561024;
        double mediumD = (double)512 / 128;
        double smallD = (double)6.27456 / 1024;
        // Standardausgabe mit voller Genauigkeit
        System.out.println("Standardformat:");
        System.out.println("big double: " + bigD);
        System.out.println("medium double: " + mediumD);
        System.out.println("small double: " + smallD);
        // Formatierung mit mindestens 3 Vorkomma- und ggf. 2 Nachkommastellen
        System.out.println("\nFormatiert:");
        DecimalFormat format = new DecimalFormat("###000.##");
        System.out.println("big double: " + format.format(new Double(bigD)));
        System.out.println("medium double: " + format.format(new Double(mediumD)));
        System.out.println("small double: " + format.format(new Double(smallD)));
        
        // mit lokalisierter Formatierung
        System.out.println("\nUS-Locale:");
        NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.US);
        ((DecimalFormat) numberFormat).applyPattern("###.##");
        String zahl = numberFormat.format(new Double(bigD));
        System.out.println("formatierter String:");
        System.out.println(zahl);
        double d = new Double(zahl).doubleValue();
        System.out.println("beschnittener double-Wert:");
        System.out.println(d * 2);
    }
}

Das Beispiel demonstriert die Formatierung und ergibt die folgende Ausgabe:

Standardformat:
big double: 1537959.274561024
medium double: 4.0
small double: 0.0061275

Formatiert:
big double: 1537959,27
medium double: 004
small double: 000,01

US-Locale:
formatierter String:
1537959.27
beschnittener double-Wert:
3075918.54