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.


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.


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


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

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"

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

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

4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);

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


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

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

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

formatStr(2524.2) // 2,254.20



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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.