Jak ustawić separator tysięcy w Javie?

129

Jak ustawić separator tysięcy w Javie?
Mam reprezentację ciągu typu BigDecimal, którą chcę sformatować za pomocą separatora tysięcy i zwrócić jako ciąg.

Czas zabawy
źródło
czy otrzymujesz te wartości od DB?
Martwy programista,

Odpowiedzi:

110

To powinno działać (nieprzetestowane, oparte na JavaDoc):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Według JavaDoc rzutowanie w pierwszej linii powinno być zachowane dla większości lokalizacji.

Andreas Dolk
źródło
16
Niesprawdzone komentarz na tym: Javadoc dla getDecimalFormatSymbols()mówi: Returns: a copy of the desired DecimalFormatSymbols. Dlatego powinieneś użyć setDecimalFormatSymbols(theCopy)po zmianie kopii.
java.is.for.desktop,
6
Dokumentacja bd.longValue () mówi: „jakakolwiek część ułamkowa zostanie odrzucona”. Więc nie wiem, czy to najlepszy sposób, aby to zrobić, jeśli zależy ci na precyzji
codinguser.
2
Myślę, że możesz użyć newi ustawić go z powrotem na formatyzator: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong
Myślę, że chciałbyś użyć \ u00a0 (nierozdzielającej spacji) jako separatora grupującego. Jest to ustawienie domyślne w niektórych lokalizacjach.
ACV
3
Dlaczego nazywasz longValue? Chodziło o ustawienie operatora tysięcy dla BigDecimal, a nie długiego.
FINDarkside
232

Możesz użyć funkcji formatowania z ",";

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

„,” obejmuje znaki grupowania specyficzne dla ustawień regionalnych.

dokumenty

syloc
źródło
11
A jeśli chcę użyć .separatora jako separatora?
Enissay
Jak zwykle używam formatu String.format, jest to dla mnie najlepsze i najłatwiejsze!
Ali
16
@Enissay Zadzwoń format()z wyraźnej lokalizacji ( Local.USznane jest stosowanie ,jako separator), a następnie zastąpić ,z niestandardowego separatora: String.format(Locale.US, "%,d", n).replace(',', '.').
minipif
java.util.IllegalFormatConversionException:% d nie może sformatować argumentów java.lang.String
Iman Marashi
1
@ImanMarashi Cast it to an int. Lub a long. Lub a BigInteger. I wykorzystanie f jeśli chcesz używać double, floatlub BigDecimal.
Adowrath,
56
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

EDYTOWAĆ

Aby uzyskać niestandardowy separator grupowania, taki jak spacja, wykonaj następujące czynności:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));
adarshr
źródło
Wiem, że muszę użyć DecimalFormatSymbols setGroupingSeparator, ale nie wiem, jak zastosować to na moim BigDecimal
Funtime
1
@Funtime: nie „stosujesz go na swoim BigDecimal”. Budujesz NumberFormatobiekt z żądanymi właściwościami i używasz go do formatowania BigDecimal. A BigDecimalma tylko określoną wartość, nie ma określonego formatu.
Joachim Sauer,
1
Zwróć uwagę, że separator tysięcy jest generalnie spacją nierozdzielającą (jeśli jest to spacja)
cquezel
Musiałem zmienić górną linię w drugiej opcji na DecimalFormatSymbols symbols = new DecimalFormatSymbols (); żeby to zadziałało.
PaperThick
14

wypróbuj ten kod, aby sformatować taki jak używany w Brazylii:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"
dellasavia
źródło
2
Ty też spróbuj tego, w przypadku JasperReports, wymuszając poprawny format: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); Wyślij ten parametr do raportu.
dellasavia
8

Jeśli używasz separatora tysięcy dla typu danych Integer, użyj 1.

  1. Dla danych całkowitych Type

String.format ("%, d \ n", 58625), a wynik będzie równy 58 625

  1. Dla danych zmiennoprzecinkowych typu String.format ("% ,. 2f", 58625.21), a wynik będzie równy 58 625,21
Waqas Ahmed
źródło
To było objawienie. Jednak naprawdę trzeba podkreślić, że „,” jest tylko flagą, a nie znakiem, którego używa jako separatora grup. (Znalezienie problemu zajęło
Vankog
5
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);
Martwy programista
źródło
4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);
Gadanina
źródło
3

Zaakceptowana odpowiedź musi być naprawdę zmieniona, inaczej nie zadziała. W getDecimalFormatSymbols tworzy kopię w obronie. A zatem,

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Nowa linia to ta: formatter.setDecimalFormatSymbols (symbols);

Amio.io
źródło
2

Dla dziesiętnych :

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));
akelec
źródło
1

Jak wspomniano powyżej, poniższy link zawiera kod kraju, który pozwala Javie zlokalizować numer. Każdy kraj ma swój własny styl.

W powyższym linku znajdziesz kod kraju, który należy umieścić tutaj:

...(new Locale(<COUNTRY CODE HERE>));

Na przykład Szwajcaria formatuje liczby w następujący sposób:

1000,00 -> 1'000,00

kod pocztowy

Aby to osiągnąć, działają dla mnie następujące kody :

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

Wynik jest zgodny z oczekiwaniami:

1'000.00
0xjacobb
źródło
1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20


Kadir Erturk
źródło
Chociaż ten kod może zapewnić rozwiązanie tego pytania, lepiej jest dodać kontekst, dlaczego / jak to działa. Może to pomóc przyszłym użytkownikom w nauce i zastosowaniu tej wiedzy we własnym kodzie. Prawdopodobnie uzyskasz również pozytywne opinie użytkowników w postaci głosów za, gdy kod zostanie wyjaśniony.
borchvm