Jak mogę sformatować liczbę typu String, aby zawierała przecinki i zaokrąglenie?


142

Jaki jest najlepszy sposób sformatowania następującej liczby, która została mi podana jako ciąg?

String number = "1000500000.574" //assume my value will always be a String

Chcę, aby był to ciąg o wartości: 1,000,500,000.57

Jak mogę to sformatować jako takie?

Odpowiedzi:


256

Możesz spojrzeć na DecimalFormatklasę; obsługuje różne ustawienia regionalne (np. w niektórych krajach, które zostałyby sformatowane jako 1.000.500.000,57).

Musisz również przekonwertować ten ciąg na liczbę, można to zrobić za pomocą:

double amount = Double.parseDouble(number);

Przykład kodu:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));

czy możesz pokazać przykład, jak mogę używać NumberFormat w tym konkretnym przypadku?
Sheehan Alam

1
możesz też użyć poniższego rozwiązania - public static String getRoundOffValue (double value) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); return df.format (wartość); }
Jitendra Nath

Wolę też zero przed kropką, np. DecimalFormat formatter = new DecimalFormat ("#, ## 0,00"); - zdobycie .00 za zero brzmi dla mnie źle
Leo

46

Można to również osiągnąć za pomocą String.format (), co może być łatwiejsze i / lub bardziej elastyczne, jeśli formatujesz wiele liczb w jednym ciągu.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

W przypadku ciągu formatu „%. 2f„ - ”,„ oznacza oddzielne grupy cyfr przecinkami, a „.2” oznacza zaokrąglenie do dwóch miejsc po przecinku.

Informacje na temat innych opcji formatowania można znaleźć pod adresem https://docs.oracle.com/javase/tutorial/java/data/numberformat.html


42

Po przekonwertowaniu ciągu na liczbę możesz użyć

// format the number for the default locale
NumberFormat.getInstance().format(num)

lub

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)

Jak jednocześnie określić lokalizację i zaokrąglenie do (powiedzmy) 2 miejsc po przecinku?
Jonik,

6
Ach, nieważne, znalazłem to:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
Jonik,

16

Biorąc pod uwagę, że jest to numer jeden w wynikach Google format number commas java, oto odpowiedź, która działa dla osób, które pracują z liczbami całkowitymi i nie dbają o ułamki dziesiętne.

String.format("%,d", 2000000)

wyjścia:

2,000,000

działa również dla liczb zmiennoprzecinkowych, np. printf ("%, f \ n", decimalNumber)
philwalk

12

Stworzyłem własne narzędzie do formatowania. Który jest niezwykle szybki w przetwarzaniu formatowania, a także zapewnia wiele funkcji :)

To wspiera:

  • Formatowanie przecinka Np. 1234567 staje się 1234,567.
  • Przedrostek z „Tysiąc (K), Milion (M), Miliard (B), Bilion (T)”.
  • Dokładność od 0 do 15.
  • Precyzyjna zmiana rozmiaru (oznacza, że ​​jeśli chcesz uzyskać dokładność 6 cyfr, ale masz tylko 3 dostępne cyfry, wymusza to 3).
  • Obniżenie prefiksu (oznacza, że ​​jeśli wybrany przedrostek jest zbyt duży, obniża go do bardziej odpowiedniego prefiksu).

Kod można znaleźć tutaj . Nazywasz to tak:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

Powinienem również zauważyć, że nie obsługuje to obsługi liczb dziesiętnych, ale jest bardzo przydatne w przypadku wartości całkowitych. Powyższy przykład pokaże „1,23 mln” jako wyjście. Prawdopodobnie mógłbym dodać obsługę liczb dziesiętnych, ale od tamtej pory nie widziałem zbyt wiele pożytku z tego, równie dobrze mógłbym połączyć to w klasę typu BigInteger, która obsługuje skompresowane tablice char [] do obliczeń matematycznych.


2
Jest to dobre, jeśli pracujesz tylko w języku angielskim. Sugeruję, aby unikać czegoś takiego jak wkurzona kolacja moich nieanglojęzycznych użytkowników, ponieważ nie mogli zrozumieć, co Klub Moznacza
rishabhmhjn

@rishabhmhjn, ale ... czy nie możesz go po prostu dostosować, aby zmodyfikować go do dowolnej litery, której potrzebujesz? czy twój pech jest jego winą? : o i to, co stworzył, jest całkiem fajne, mimo że link wydaje się teraz niedostępny ..
Aquarius Power

@AquariusPower problem polega np. Na tym, że liczby japońskie nie są zgodne z systemem metrycznym. Ich liczby to 1 百 za 100, 1 千 za 1000, 1 万 za 10000, a następnie 1 千万 za 1000,0000. Mój zespół pracował nad czymś podobnym w Javascript. Możesz użyć logiki wspomnianej w tym: github.com/statusbrew/angular-bignumber
rishabhmhjn

Znalazłem mój stary kod, więc ponownie przesłałem go do GitHub. Zaktualizowano link w komentarzu.
Jeremy Trifilo

6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}

6

możesz również skorzystać z poniższego rozwiązania -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}

4

Całą konwersję możesz wykonać w jednej linii, używając następującego kodu:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

Ostatnie dwa znaki # w konstruktorze DecimalFormat mogą również wynosić 0. Tak czy inaczej działa.


3

Pierwsza odpowiedź działa bardzo dobrze, ale dla ZERO / 0 będzie miała format .00

Dlatego format #, ## 0,00 działa dobrze dla mnie. Zawsze testuj różne liczby, takie jak 0/100 / 2334.30 i liczby ujemne, przed wdrożeniem do systemu produkcyjnego.


3

Oto najprostszy sposób, aby się tam dostać:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

produkcja: 10 987 655,88

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.