Format Problem mit Wert - bekomme 0,10 anstatt 10,00

internet

Top Contributor
Hallo,

ich habe ein Problem mit Java 8. Ich hatte davor eine Methode, die mir eine Zahl entsprechend formatiert. In Java7 hatte das m.W. auch funktioniert.
ich habe dazu eine Klasse, in der ich einstelle wieviel Dezimalstellen meine Zahl haben soll etc. (Klasse: FormatSetting).

Mein Problem ist nun aber, dass ich im Parameter mit 10 reingehe, ich aber nicht 10,00 bekomme, sondern 0,10.
Kann mir jemand helfen wo das Problem ist?

Ich vermute hier:

Java:
String format = "#0" + String.format("%." + formatSettings.getNumberDecimalPlaces() + "f", .1)
.replace("1", "0").substring(1);

Aber auch hier bekomme ich #0,00 war doch eigentlich richtig ist?

Java:
public static String formatNumber(FormatSetting formatSettings, Number d) {

        StringBuilder value = new StringBuilder();

        try {
            if (formatSettings != null) {

                DecimalFormatSymbols dcm = new DecimalFormatSymbols(Locale.getDefault());

                if (formatSettings.getNumberDecimalSeparator() != null)
                    dcm.setDecimalSeparator(formatSettings.getNumberDecimalSeparator().charAt(0));

                if (formatSettings.getNumberThousandSeparator() != null)
                    dcm.setGroupingSeparator(formatSettings.getNumberThousandSeparator().charAt(0));
                
                String format = "#0" + String.format("%." + formatSettings.getNumberDecimalPlaces() + "f", .1)
                        .replace("1", "0").substring(1);

                if (formatSettings.getNumberPattern() != null
                        && !FormatSetting.Pattern.NONE.toString().equals(formatSettings.getNumberPattern())) {
                    format = "+" + formatSettings.getNumberPattern() + ";-" + formatSettings.getNumberPattern();
                }

                DecimalFormat dc = new DecimalFormat(format, dcm);
                String numberStr = dc.format(d);

                if (formatSettings.getNumberNegativeSignSymbol() != null && FormatSetting.SignPosition.BEGINNING
                        .toString().equals(formatSettings.getNumberNegativeSignPosition())) {
                    if (d.doubleValue() < 0)
                        value.append(formatSettings.getNumberNegativeSignSymbol());
                }

                value.append(numberStr);

                if (formatSettings.getNumberNegativeSignSymbol() != null && FormatSetting.SignPosition.END.toString()
                        .equals(formatSettings.getNumberNegativeSignPosition())) {
                    if (d.doubleValue() < 0)
                        value.append(formatSettings.getNumberNegativeSignSymbol());
                }
            }

            return value.toString();

        } catch (Exception ex) {
            ex.printStackTrace();
            value = new StringBuilder("" + d);
        }
        return "";
    }

Hier mal die Ausgabe im Debugger von DecimalFormat dc

1612251604010.png

Hier meine Werte für die Einstellung:
1612252122268.png
 
Vermutlich willst Du, dass dein format String #0.00 ist. Aber genau kann ich es nicht sagen, da ich nicht wirklich durchblicke, was Du da aus welchem Grund gebaut hast.

Aber bezüglich des Codes evtl. zwei Dinge, die mir aufgefallen sind:
- Catch von Exception ist etwas, das man in der Regel vermeiden sollte... Statt dessen gezielt die Exceptions abfangen, die notwendig sind.
- Du setzt in catch value aber gibst den leeren String zurück - Du willst evtl. generell value.toString() zurück geben ...
 
Java 1.8:
Java:
import java.text.DecimalFormat;

public class Main {

	public static void main(String[] args) {

		double z = 10.0;

		DecimalFormat dz = new DecimalFormat("#0.00");
		System.out.println(dz.format(z));

		DecimalFormat dz2 = new DecimalFormat("#0,00");
		System.out.println(dz2.format(z));
	}

}

Ausgabe:
Java:
10,00
0.10
 
Nur noch als kurze Randbemerkung bezüglich dem "," -> Das ist ja wie bereits geschrieben ein Grouping Separator. Du willst also nach zwei Zeichen Gruppieren ... und Du willst Da noch eine 0 davor haben. Daher ist das weiterhin eine 10. Diese bekommt aber noch eine führende 0: 010 und nach den ersten Zwei Ziffern kommt der grouping separator: 0.10.

Bezüglich Grouping Separator kann man ja einfach mal paar mehr Dinge machen, wie z.B. den Standard Separator durch ein Leerzeichen ersetzen um dann mal mehrere Separatoren anzugeben:
Java:
        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setGroupingSeparator(' ');
        DecimalFormat formater = new DecimalFormat("#,#0", symbols);
        System.out.println(formater.format(123.0));
        System.out.println(formater.format(1234.0));
        System.out.println(formater.format(12345.0));

Dann wird die Funktion deutlich falls dies noch etwas unklar war denke ich. # sind halt optionale Ziffern, 0 steht für eine Ziffer, die immer geben werden soll und "," für den Grouping Separator. Wichtig ist halt, dass es um eine feste Gruppierung geht. Also gehen immer nur gleiche Blöcke und kein "#,##,#" oder so (Also am Ende nur eine Ziffer, davor zwei ....
 

Zurück
Oben