Doppelte Dezimalformatierung in Java

118

Ich habe einige Probleme beim Formatieren der Dezimalstellen eines Doppels. Wenn ich einen doppelten Wert habe, z. B. 4.0, wie formatiere ich die Dezimalstellen so, dass sie stattdessen 4,00 betragen?

Christoffer
quelle
Versuchen Sie es mit String.format()oder java.text.Format.
Code-Apprentice
Mögliches Duplikat von Nur zweistellig nach Dezimalzahl
anzeigen

Antworten:

218

Eine Möglichkeit wäre die Verwendung von NumberFormat .

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

Ausgabe:

4.00

kosa
quelle
1
Ja, aber ich möchte kein Komma, ich möchte ein Dezimalzeichen.
Christoffer
Ich bekomme ein Komma. Das habe ich getan. "double variable; NumberFormat formatter = new DecimalFormat (" # 0.00 "); System.out.println (formatter.format (variable));
Christoffer
Ausgabe dafür ist X, 00 und nicht X.00
Christoffer
9
Sie erhalten ein Komma aufgrund der von Ihrer JVM verwendeten Standardsprache, die sich wahrscheinlich von der von Nambari unterscheidet. Werfen Sie einen Blick auf NumberFormat javadoc: docs.oracle.com/javase/1.4.2/docs/api/java/text/…
Michael Zilbermann
1
Wie zim2001 zeigte, kann Ihr Gebietsschema anders sein. Lesen Sie den Link in meiner Antwort. Am Ende finden Sie Informationen dazu.
kosa
73

Mit Java 8 können Sie die formatMethode .. verwenden: -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • fwird für den floatingPunktwert verwendet.
  • 2 Nach Dezimalstelle wird die Anzahl der Nachkommastellen angegeben .

Für die meisten Java-Versionen können Sie Folgendes verwenden DecimalFormat:

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));
Rohit Jain
quelle
43

Verwenden Sie String.format :

String.format("%.2f", 4.52135);

Gemäß Dokumentation:

Das immer verwendete Gebietsschema ist das von Locale.getDefault().

Vincent Mimoun-Prat
quelle
8
String.format akzeptiert auch ein Gebietsschema als ersten Parameter, um die Formatierung von Dezimalzeichen zu berücksichtigen.
Vincent Mimoun-Prat
4
Geben Sie das US-Gebietsschema an, um länderspezifische Dezimalzeichen (z. B. ein Komma) zu vermeiden: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233
3
Ich würde sagen, "um das US-Gebietsschema-spezifische Punkt als Dezimalzeichen zu verwenden, geben Sie das US-Gebietsschema an". Diese Idee, dass US-Gewohnheiten die richtigen sind und alles andere "Volks" -Ding ist, macht mich verrückt.
Simone Gianni
@ SimoneGianni Machen Sie keine dummen Annahmen, manche Leute brauchen möglicherweise die Dezimalstelle, um ein Punkt zu sein. Zum Beispiel schreibe ich eine Funktion, die ein CSV-Dokument exportiert, und ich kann kein Komma haben, da das Komma das Trennzeichen ist.
Kaiser Keister
19

Mit String.format können Sie Folgendes tun:

double price = 52000;
String.format("$%,.2f", price);

Beachten Sie das Komma, das dies von der Antwort von @ Vincent unterscheidet

Ausgabe:

$52,000.00

Eine gute Quelle für die Formatierung ist die offizielle Java-Seite zu diesem Thema

Ojonugwa Jude Ochalifu
quelle
6

Sie können immer die statische Methode verwenden printf from System.out- Sie implementieren dann den entsprechenden Formatierer. Dies spart Heap-Speicherplatz, für den andere Beispiele erforderlich waren.

Ex:

System.out.format("%.4f %n", 4.0); 

System.out.printf("%.2f %n", 4.0); 

Spart Heap-Speicherplatz, was ein ziemlich großer Bonus ist. Dennoch bin ich der Meinung, dass dieses Beispiel viel einfacher zu handhaben ist als jede andere Antwort, zumal die meisten Programmierer die printf-Funktion von C kennen (Java ändert die Funktion / Methode jedoch geringfügig).

Lewis Robbins
quelle
1
@Baz Vermisse ich hier ein entscheidendes Detail, es wird kein printStream erwähnt. Das OP bittet um Formatierungshilfe (die durch Betrachten der Java-Dokumente einfacher gelöst werden könnte) für den Standardausgabestream. Erklären.
Lewis Robbins
Mein Fehler. Schaute auf die falsche Javadoc-Version (1.4). Übrigens: outist das PrintStream.
Baz
@Baz Keine Sorge. Ja, ich habe angenommen, dass dies die Klasse ist, auf die Sie sich bezogen haben. In allen meinen Büchern wird printf als statische Methode aus System.out bezeichnet (da diese Methoden statisch sind).
Lewis Robbins
1
Um genau zu sein, printfist eine statische Methode von PrintStream. Siehe hier ;) Aber trotzdem +1.
Baz
@Baz Von den Dokumenten hat die printStream-Klasse System.out geerbt. Ich könnte mich vielleicht irren - obwohl es ziemlich seltsam ist, eine statische Methode zu erben (ist es überhaupt möglich)? Du erwartest aber richtig.
Lewis Robbins
4
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));
Michael Zilbermann
quelle
3
new DecimalFormat("#0.00").format(4.0d);
Subhrajyoti Majumder
quelle
1

Eine alternative Methode ist die Verwendung der setMinimumFractionDigitsMethode aus der NumberFormatKlasse.

Hier legen Sie grundsätzlich fest, wie viele Zahlen nach dem Dezimalpunkt erscheinen sollen.

Eine Eingabe von 4.0würde also ergeben 4.00, vorausgesetzt, Ihre angegebene Menge war 2.

Wenn Ihre DoubleEingabe jedoch mehr als den angegebenen Betrag enthält, wird der angegebene Mindestbetrag verwendet, und es wird eine weitere auf- / abgerundete Ziffer hinzugefügt

Zum Beispiel wird 4.15465454mit einer angegebenen Mindestmenge von 2 produziert4.155

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

Probieren Sie es online aus

achAmháin
quelle
1

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

Angenommen, Ihre ursprüngliche Nummer ist unten angegeben:

 double number = 2354548.235;

Verwenden von NumberFormat:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

Verwenden von String.format:

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

Verwenden von DecimalFormat und Muster:

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

Verwenden von DecimalFormat und Muster

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

In allen Fällen lautet die Ausgabe : 2354548.23

Hinweis :

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

    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

Sie können eine der folgenden Methoden verwenden

  1. Wenn Sie verwenden java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));

    ODER

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Wenn Sie es in ein einfaches Zeichenfolgenformat konvertieren möchten

    System.out.println(String.format("%.2f", 4.0)); 

Der gesamte obige Code gibt 4,00 aus

Fazil
quelle
0

Funktioniert zu 100%.

import java.text.DecimalFormat;

public class Formatting {

    public static void main(String[] args) {
        double value = 22.2323242434342;
        // or  value = Math.round(value*100) / 100.0;

        System.out.println("this is before formatting: "+value);
        DecimalFormat df = new DecimalFormat("####0.00");

        System.out.println("Value: " + df.format(value));
    }

}
Mayank Parihar
quelle
-3

Erster Import NumberFormat. Dann füge folgendes hinzu:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

Dies gibt Ihnen zwei Dezimalstellen und ein Dollarzeichen, wenn es sich um Währung handelt.

import java.text.NumberFormat;
public class Payroll 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
    int hoursWorked = 80;
    double hourlyPay = 15.52;

    double grossPay = hoursWorked * hourlyPay;
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
    }

}
Nick
quelle
1
Bei der Frage geht es nicht um die Anzeige einer Währung, sondern um eine genauere Beantwortung mithilfe von Formatierungsfunktionen (wie in anderen Antworten beschrieben).
Yacc
-4

Sie können dies wie folgt tun:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));
flosk8
quelle
1
Funktioniert nicht, weil es ##anstelle von00
Joaquin Iurchuk
-4

Ich weiß, dass dies ein altes Thema ist, aber wenn Sie den Punkt wirklich gerne anstelle des Kommas haben möchten, speichern Sie Ihr Ergebnis einfach als X, 00 in einem String und ändern Sie es dann einfach für einen Zeitraum, damit Sie X.00 erhalten

Am einfachsten ist es, nur Ersetzen zu verwenden.

String var = "X,00";
String newVar = var.replace(",",".");

Die Ausgabe ist die von Ihnen gewünschte X.00 . Um es einfach zu machen, können Sie alles auf einmal erledigen und in einer doppelten Variablen speichern:

Double var = Double.parseDouble(("X,00").replace(",",".");

Ich weiß, dass diese Antwort momentan nicht nützlich ist, aber vielleicht sucht jemand, der dieses Forum überprüft, nach einer schnellen Lösung wie dieser.

Edgar Rivas
quelle