Podwójne formatowanie dziesiętne w Javie


118

Mam problemy z formatowaniem ułamków dziesiętnych podwójnej. Jeśli mam podwójną wartość, np. 4.0, jak sformatować ułamki dziesiętne, aby zamiast tego było 4,00?




Odpowiedzi:


218

Jednym ze sposobów byłoby użycie NumberFormat .

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

Wynik:

4.00


1
Tak, ale nie chcę przecinka, chcę znak dziesiętny.
Christoffer

Dostaję przecinek. To właśnie zrobiłem. "podwójna zmienna; NumberFormat formatter = new DecimalFormat (" # 0.00 "); System.out.println (formatter.format (zmienna));
Christoffer

wyjście dla tego to X, 00, a nie X.00
Christoffer

9
Otrzymujesz przecinek z powodu domyślnego języka używanego przez maszynę JVM, który prawdopodobnie różni się od języka Nambari. Spójrz na NumberFormat javadoc: docs.oracle.com/javase/1.4.2/docs/api/java/text/…
Michael Zilbermann

1
Jak wskazał zim2001, Twoje ustawienia regionalne mogą być inne. Przeczytaj link podany w mojej odpowiedzi. Na końcu znajdziesz informacje na ten temat.
kosa

73

W Javie 8 możesz użyć formatmetody ..: -

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

System.out.printf("%.2f", 4.0); 
  • f jest używany do floating wartość punktowa.
  • 2 po przecinku oznacza liczbę miejsc po przecinku .

W przypadku większości wersji Java możesz użyć DecimalFormat: -

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

43

Użyj formatu String.format :

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

Zgodnie z dokumentami:

Zawsze używane ustawienie narodowe jest zwracane przez Locale.getDefault().


8
String.format akceptuje także ustawienia narodowe jako pierwszy parametr uwzględniający formatowanie znaku dziesiętnego.
Vincent Mimoun-Prat

4
Aby uniknąć znaków dziesiętnych specyficznych dla ustawień regionalnych (takich jak przecinek), określ ustawienia narodowe USA: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233,

3
Powiedziałbym: „aby użyć kropki specyficznej dla lokalizacji amerykańskiej jako znaku dziesiętnego, określ ustawienia regionalne dla Stanów Zjednoczonych” .. pomysł, że nawyki w Stanach Zjednoczonych są właściwe, a wszystko inne to coś w rodzaju „ludowych” rzeczy doprowadza mnie do szału.
Simone Gianni

@SimoneGianni Nie rób głupich założeń, niektórzy ludzie mogą potrzebować kropki po przecinku. Na przykład piszę funkcję, która eksportuje dokument CSV i nie mogę mieć przecinka, ponieważ znak przecinka jest ogranicznikiem.
Kaiser Keister

19

Używając String.format, możesz to zrobić:

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

Zwróć uwagę na przecinek, który odróżnia to od odpowiedzi @ Vincenta

Wynik:

$52,000.00

Dobrym źródłem informacji o formatowaniu jest oficjalna strona Java na ten temat


6

Zawsze możesz użyć metody statycznej printf from System.out- następnie zaimplementowałbyś odpowiedni program formatujący; oszczędza to miejsce na stosie, na którym wymagały tego inne przykłady.

Dawny:

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

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

Oszczędza miejsce na stosie, co jest dość dużą zaletą, niemniej jednak uważam, że ten przykład jest znacznie łatwiejszy w zarządzaniu niż jakakolwiek inna odpowiedź, zwłaszcza, że ​​większość programistów zna funkcję printf z C (chociaż Java nieznacznie zmienia funkcję / metodę).


1
@Baz Czy brakuje mi tu kluczowego szczegółu, nie wspomniano o printStream. OP prosi o pomoc w formatowaniu (którą można łatwiej rozwiązać, przeglądając dokumentację Java) do standardowego strumienia wyjściowego. Wyjaśnić.
Lewis Robbins

Mój błąd. Sprawdziłem niewłaściwą wersję javadoc (1.4). BTW: outjest PrintStream.
Baz

@Baz Nie martw się. Tak, założyłem, że to klasa, do której się odnosiłem, we wszystkich moich książkach printf jest określana jako metoda statyczna z System.out (ponieważ te metody są statyczne).
Lewis Robbins

1
Dokładniej, printfjest to statyczna metoda PrintStream. Zobacz tutaj ;) Ale mimo to +1.
Baz

@Baz Z dokumentacji klasa printStream odziedziczyła System.out. Mógłbym się może mylić - chociaż dziedziczenie metody statycznej jest dość dziwne (czy to w ogóle możliwe)? Ale spodziewam się, że masz rację.
Lewis Robbins

4
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));


1

Alternatywną metodą jest użycie setMinimumFractionDigitsmetody zNumberFormat klasy.

Tutaj w zasadzie określasz, ile liczb ma się pojawić po przecinku.

Tak więc wkład w postaci 4.0wyprodukowałby4.00 , zakładając, że podana przez Ciebie kwota wynosi 2.

Ale jeśli twój Double dane wejściowe zawierają więcej niż określona kwota, zajmie określoną minimalną kwotę, a następnie dodaj jeszcze jedną cyfrę zaokrągloną w górę / w dół

Na przykład 4.15465454przy minimalnej określonej ilości 2 wyprodukuje4.155

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

Wypróbuj online


1

Można to zrobić na wiele sposobów. Poniżej podano:

Załóżmy, że Twój oryginalny numer jest podany poniżej:

 double number = 2354548.235;

Korzystanie z NumberFormat:

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

Korzystanie z String.format:

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

Korzystanie z DecimalFormat i wzorca:

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

Korzystanie z DecimalFormat i wzorca

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

We wszystkich przypadkach wynik będzie następujący: 2354548,23

Uwaga :

Podczas zaokrąglania możesz dodać RoundingModeswój formater. Oto kilka trybów zaokrąglania podanych poniżej:

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

Oto import :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

Możesz użyć dowolnej z poniższych metod

  1. Jeśli używasz java.text.DecimalFormat

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

    LUB

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Jeśli chcesz przekonwertować go na prosty format ciągu

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

Cały powyższy kod spowoduje wydrukowanie 4,00


0

Działa w 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));
    }

}

-3

Pierwszy import NumberFormat. Następnie dodaj to:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

To da ci dwa miejsca po przecinku i umieści znak dolara, jeśli chodzi o walutę.

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));
    }

}

1
Pytanie nie dotyczy wyświetlania waluty, a dokładniejszą odpowiedź można uzyskać za pomocą funkcji formatowania), jak opisano w innych odpowiedziach).
yacc

-4

Możesz to zrobić w następujący sposób:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

1
Nie działa, ponieważ używa ##zamiast00
Joaquin Iurchuk

-4

Wiem, że to stary temat, ale jeśli naprawdę lubisz mieć kropkę zamiast przecinka, po prostu zapisz swój wynik jako X, 00 w ciągu znaków, a następnie po prostu zmień go na okres, aby otrzymać X,00

Najprostszym sposobem jest użycie zamiany.

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

Wynik będzie żądanym X.00 . Aby było to łatwiejsze, możesz zrobić to wszystko za jednym razem i zapisać w podwójnej zmiennej:

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

Wiem, że ta odpowiedź na razie się nie przydaje, ale może ktoś sprawdzający to forum będzie szukał takiego szybkiego rozwiązania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.