String.format () zum Formatieren von Double in Java

177

Wie kann ich String.format (Format String, X) verwenden, um ein Double wie folgt zu formatieren?

2354548.235 -> 2.354.548,23

Vielen Dank!

Kike
quelle

Antworten:

295
String.format("%1$,.2f", myDouble);

String.format Verwendet automatisch das Standardgebietsschema.

David Tang
quelle
36
Sie können auch ein bestimmtes Gebietsschema verwenden, indem SieString.format(Locale.GERMAN, "%1$,.2f", myDouble);
Olivier Grégoire
13
Wenn mehr als ein Double formatiert werden muss, verwenden Sie% 1,% 2 usw. Zum Beispiel String.format ("% 1 $,. 2f,% 2 $,. 2f", myDouble, aDouble)
Moesio
4
Ich glaube, dass "% 1 $" in diesem Fall optional ist. Funktioniert bei mir nur mit "%, 2f" als Formatzeichenfolge.
Matt Passell
5
Ja, Matt hat recht. %1, %2usw. können verwendet werden, um die Ausgabe basierend auf dem Index Ihrer Eingabeargumente neu zu ordnen. Sehen Sie das . Sie können den Index weglassen und die Standardreihenfolge wird vom Formatierer übernommen.
Praneetloke
1
Sie sollten eine Erklärung geben, was die verschiedenen Teile bedeuten.
Mitulát báti
41
String.format("%4.3f" , x) ;

Dies bedeutet, dass wir insgesamt 4 Stellen in ans benötigen, von denen 3 nach der Dezimalstelle stehen sollten. Und f ist der Formatbezeichner von double. x bedeutet die Variable, für die wir sie finden möchten. Hat für mich gearbeitet. . .

user3304797
quelle
1
Ich denke, es bedeutet, dass es die vierte Variable in den folgenden Argumenten sein wird und 3 Stellen nach der Dezimalstelle hat.
Michael Fulton
@MichaelFulton Es ist nicht so einfach: String.format("%014.3f" , 58.656565)-> 0000000058,657: 14 Symbole insgesamt: 8 Nullen und 5 Zahlen und 1 Komma. In diesem Fall 14 bedeutet Zahl die Gesamtzahl der Symbole (zusätzliche werden durch führende Null ersetzt, könnten ohne auskommen, dann würde sie durch Leerzeichen ersetzt werden) in der Ergebniszeichenfolge . Der .3Teil ist hier völlig unabhängig.
Parsecer
Allerdings hier: String.format("%014.3f" , 58.656565)-> 58,657. Ich nehme es, weil der Teil bevorzugt wird .3f: Es druckt zuerst die Zahl mit 3 Dezimalstellen und danach, wenn noch Symbole übrig sind , führende Leerzeichen (oder Nullen / was auch immer). In diesem Fall ist die Zahl 2 + 3 + 1 = 6 Symbole und wir wollten nur 4 drucken, daher gibt es sicherlich keine zusätzlichen Leerzeichen.
Parsecer
24

Wenn Sie es mit manuell festgelegten Symbolen formatieren möchten, verwenden Sie Folgendes:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);
System.out.println(decimalFormat.format(1237516.2548)); //1,237,516.25

Eine auf dem Gebietsschema basierende Formatierung wird jedoch bevorzugt.

mdrg
quelle
3
Nützliche Antwort! Der letzte Satz "Gebietsschema-basierte Formatierung wird jedoch bevorzugt" ist ohne Kontext nicht sinnvoll. Es gibt ziemlich gute Anwendungsfälle, in denen Sie KEINE auf dem Gebietsschema basierende Formatierung verwenden sollten, wenn Sie ein bestimmtes Format des Strings generieren möchten. Sie implementieren beispielsweise den Export Ihrer Daten in eine externe Datei und möchten die vollständige Kontrolle über das Format haben, unabhängig vom aktuellen (oder einem beliebigen) Gebietsschema.
Honza Zidek
20

aus diesem Link extrahierter Code ;

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + 
                   currentLocale.toString());

Die Ausgabe dieses Beispiels zeigt, wie sich das Format derselben Nummer mit dem Gebietsschema ändert:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US
Gursel Koca
quelle
13
public class MainClass {
   public static void main(String args[]) {
    System.out.printf("%d %(d %+d %05d\n", 3, -3, 3, 3);

    System.out.printf("Default floating-point format: %f\n", 1234567.123);
    System.out.printf("Floating-point with commas: %,f\n", 1234567.123);
    System.out.printf("Negative floating-point default: %,f\n", -1234567.123);
    System.out.printf("Negative floating-point option: %,(f\n", -1234567.123);

    System.out.printf("Line-up positive and negative values:\n");
    System.out.printf("% ,.2f\n% ,.2f\n", 1234567.123, -1234567.123);
  }
}

Und ausdrucken:

3 (3) +3 00003
Standard-Gleitkommaformat: 1234567,123000
Gleitkomma mit Kommas: 1.234.567.123000
Negativer Gleitkomma-Standard: -1,234.567,123000
Negative Gleitkommaoption: (1.234.567, 123000)

Positive und negative Werte der
Aufstellung : 1.234.567,12
-1.234.567,12

Torres
quelle
2

Es gibt viele Möglichkeiten, dies zu tun. Diese sind unten angegeben:

Angenommen, Ihre ursprüngliche Nummer ist unten angegeben: doppelte Nummer = 2354548.235;

Verwenden NumberFormatund Rundungsmodus

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
    DecimalFormat decimalFormatter = (DecimalFormat) nf;
    decimalFormatter.applyPattern("#,###,###.##");
    decimalFormatter.setRoundingMode(RoundingMode.CEILING);

    String fString = decimalFormatter.format(number);
    System.out.println(fString);

Verwenden des String-Formatierers

System.out.println(String.format("%1$,.2f", number));

In allen Fällen lautet die Ausgabe : 2354548.24

Hinweis :

Während des Rundens können Sie RoundingModeIhren Formatierer hinzufügen . Hier sind einige der unten angegebenen Rundungsmodi :

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

Hier sind die Importe :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
Md. Sajedul Karim
quelle
1

Verwenden DecimalFormat

 NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
 DecimalFormat decimalFormatter = (DecimalFormat) nf;
 decimalFormatter.applyPattern("#,###,###.##");
 String fString = decimalFormatter.format(myDouble);
 System.out.println(fString);
Anisuzzaman Babla
quelle