Bagaimana cara mengatur pemisah ribuan di Jawa?

129

Bagaimana cara mengatur pemisah ribuan di Jawa?
Saya memiliki representasi String dari BigDecimal yang ingin saya format dengan pemisah ribuan dan kembali sebagai String.

Funtime
sumber
Anda mendapatkan nilai-nilai ini dari DB?
Programmer Mati

Jawaban:

110

Ini harus bekerja (belum diuji, berdasarkan JavaDoc):

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

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

Menurut JavaDoc, para pemain di baris pertama harus disimpan untuk sebagian besar lokal.

Andreas Dolk
sumber
16
Komentar belum diuji pada ini: Javadoc untuk getDecimalFormatSymbols()mengatakan: Returns: a copy of the desired DecimalFormatSymbols. Jadi sebaiknya Anda gunakan setDecimalFormatSymbols(theCopy)setelah mengubah salinan.
java.is.for.desktop
6
Dokumen untuk bd.longValue () mengatakan "setiap bagian fraksional akan dibuang". Jadi saya tidak tahu apakah ini cara terbaik untuk melakukan ini jika Anda peduli tentang ketepatan
pengkodean
2
Saya kira Anda bisa menggunakan newdan mengaturnya kembali ke formatter: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong
Saya pikir Anda ingin menggunakan \ u00a0 (non-breaking space) sebagai pemisah pengelompokan. Ini adalah default untuk beberapa lokal.
ACV
3
Mengapa Anda memanggil longValue? Pertanyaannya adalah mengatur ribuan operator untuk BigDecimal, tidak lama.
FINDarkside
232

Anda dapat menggunakan fungsi format dengan ",";

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

//str = 124,750

"," termasuk karakter pengelompokan khusus lokal.

docs

syloc
sumber
11
Bagaimana Jika saya ingin menggunakan .sebagai pemisah?
Enissay
Seperti yang biasanya saya gunakan String.format itu yang terbaik dan termudah untuk saya!
Ali
16
@Enissay Panggil format()dengan lokal eksplisit ( Local.USdikenal dengan penggunaan ,sebagai pemisah) dan kemudian mengganti ,dengan pemisah kustom Anda: String.format(Locale.US, "%,d", n).replace(',', '.').
minipif
java.util.IllegalFormatConversionException:% d tidak dapat memformat argumen java.lang.String
Iman Marashi
1
@ImanMarashi Berikan ke int. Atau a long. Atau a BigInteger. Dan gunakan f jika Anda ingin menggunakan double, floatatau BigDecimal.
Adowrath
56
BigDecimal bd = new BigDecimal(300000);

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

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

EDIT

Untuk mendapatkan pemisah pengelompokan khusus seperti ruang, lakukan ini:

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

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));
adarshr
sumber
saya tahu saya harus menggunakan DecimalFormatSymbols setGroupingSeparator, tetapi saya tidak tahu bagaimana cara menerapkannya pada BigDecimal saya
Funtime
1
@Funtime: Anda tidak "menerapkannya pada BigDecimal Anda". Anda membangun NumberFormatobjek dengan properti yang diinginkan dan menggunakannya untuk memformat BigDecimal. A BigDecimalhanya memiliki nilai yang ditentukan, itu tidak memiliki format yang ditentukan.
Joachim Sauer
1
Perhatikan bahwa pemisah ribuan umumnya adalah ruang bebas (bila itu adalah ruang)
cquezel
Harus mengubah baris teratas pada opsi ke-2 menjadi simbol DecimalFormatSymbols = baru DecimalFormatSymbols (); agar ini bekerja.
PaperThick
14

coba kode ini untuk memformat seperti yang digunakan di Brasil:

    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
sumber
2
Anda juga mencoba ini, dalam kasus JasperReports, memaksa format benar: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); Kirim parameter ini untuk dilaporkan.
dellasavia
8

Jika Anda menggunakan ribuan pemisah untuk tipe data Integer gunakan 1.

  1. Untuk Tipe data integer

String.format ("%, d \ n", 58625) dan output akan menjadi 58.625

  1. Untuk data Floating Point, Tipe String.format ("% ,. 2f", 58625.21) dan output akan menjadi 58.625.21
Waqas Ahmed
sumber
Ini adalah pencerahan. Namun, Anda benar-benar harus menekankan, bahwa "," hanya sebuah bendera, bukan karakter yang digunakannya sebagai pemisah grup. (Butuh waktu beberapa saat untuk menemukan masalah ini.) Lihat docs.oracle.com/javase/7/docs/api/java/util/Formatter.html
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);
Programmer Mati
sumber
4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);
Mengobrol
sumber
3

Jawaban yang diterima harus benar-benar diubah jika tidak berfungsi. The getDecimalFormatSymbols membuat salinan defensif. Jadi,

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

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

Baris baru adalah ini: formatter.setDecimalFormatSymbols (simbol);

Amio.io
sumber
2

Untuk desimal :

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
sumber
1

Seperti disebutkan di atas, tautan berikut memberi Anda kode negara tertentu untuk memungkinkan Jawa melokalisasi nomor tersebut. Setiap negara memiliki gayanya sendiri.

Pada tautan di atas Anda akan menemukan kode negara yang harus ditempatkan di sini:

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

Swiss misalnya memformat angka-angka sebagai berikut:

1000,00 -> 1'000,00

Kode negara

Untuk mencapai hal ini, kode berikut berfungsi untuk saya:

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

Hasilnya seperti yang diharapkan:

1'000.00
0xjacobb
sumber
1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20


Kadir Erturk
sumber
Meskipun kode ini dapat memberikan solusi untuk pertanyaan, lebih baik menambahkan konteks mengapa / cara kerjanya. Ini dapat membantu pengguna di masa depan belajar, dan menerapkan pengetahuan itu ke kode mereka sendiri. Anda juga cenderung mendapat umpan balik positif dari pengguna dalam bentuk upvotes, ketika kode dijelaskan.
borchvm