2013-04-30 4 views
13

Ich versuche, einige Zahlen in einem Java-Programm zu formatieren. Die Zahlen sind sowohl doppelte als auch ganze Zahlen. Wenn ich mit Doppelzahlen arbeite, möchte ich nur zwei Dezimalstellen beibehalten, aber wenn ich ganze Zahlen bearbeite, möchte ich, dass das Programm sie nicht beeinflusst. Mit anderen Worten:Java: Verwenden Sie DecimalFormat, um doubles und Integers zu formatieren, aber Ganzzahlen ohne ein Dezimal-Trennzeichen zu behalten

Doubles - Eingang

14.0184849945 

Doubles - Ausgabe

14.01 

Ganze Zahlen - Eingang

13 

Ganze Zahlen - Ausgabe

13 (not 13.00) 

Gibt es eine Möglichkeit, dies in der selben DecimalFormat-Instanz zu implementieren? Mein Code ist der folgende, so weit:

DecimalFormat df = new DecimalFormat("#,###,##0.00"); 
DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.ENGLISH); 
otherSymbols.setDecimalSeparator('.'); 
otherSymbols.setGroupingSeparator(','); 
df.setDecimalFormatSymbols(otherSymbols); 
+4

Warum müssen nicht es das gleiche sein 'DecimalFormat' Instanz? Was ist falsch daran, 2 'DecimalFormat'-Instanzen zu haben, eine, um zwei Ziffern nach dem Komma zu behalten, und eine, die keine Ziffern nach dem Komma hat? – rgettman

+0

Da die Zahlen, die das Programm jedes Mal formatiert, entweder doppelte oder ganze Zahlen sind, ohne den Typ vor der Bildung zu kennen. Also möchte ich dieselbe Instanz, die "versteht", ob eine Zahl doppelt ist, um zusätzliche Dezimalpunkte zu trimmen - oder es ist eine ganze Zahl -, um sie unbeeinflusst zu lassen. – Lefteris008

Antwort

26

Sie können nur die minimumFractionDigits auf 0 wie folgt gesetzt werden:

public class Test { 

    public static void main(String[] args) { 
     System.out.println(format(14.0184849945)); // prints '14.01' 
     System.out.println(format(13)); // prints '13' 
     System.out.println(format(3.5)); // prints '3.5' 
     System.out.println(format(3.138136)); // prints '3.13' 
    } 

    public static String format(Number n) { 
     NumberFormat format = DecimalFormat.getInstance(); 
     format.setRoundingMode(RoundingMode.FLOOR); 
     format.setMinimumFractionDigits(0); 
     format.setMaximumFractionDigits(2); 
     return format.format(n); 
    } 

} 
+0

Danke, das hat das Problem gelöst! :) – Lefteris008

+0

jetzt formatiert es 44.0 bis 44 und 55.60 bis 55.6. Wie behält man die Null am Ende mit Format? – user1510006

3

Könnten Sie nicht einfach dies in ein Dienstprogramm Anruf Wrapper. Zum Beispiel

public class MyFormatter { 

    private static DecimalFormat df; 
    static { 
    df = new DecimalFormat("#,###,##0.00"); 
    DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.ENGLISH); 
    otherSymbols.setDecimalSeparator('.'); 
    otherSymbols.setGroupingSeparator(','); 
    df.setDecimalFormatSymbols(otherSymbols); 
    } 

    public static <T extends Number> String format(T number) { 
    if (Integer.isAssignableFrom(number.getClass()) 
     return number.toString(); 

    return df.format(number); 
    } 
} 

können Sie dann tun nur Dinge wie: MyFormatter.format(int) usw.