Java'da binlik ayırıcı nasıl ayarlanır?


129

Java'da binlik ayırıcı nasıl ayarlanır?
Binlik ayırıcı ile biçimlendirmek ve String olarak dönmek istediğim bir BigDecimal'in String temsiline sahibim.


bu değerleri DB'den mi alıyorsun?
Ölü Programcı

Yanıtlar:


110

Bu çalışmalıdır (JavaDoc'a göre test edilmemiştir):

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

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

JavaDoc'a göre, ilk satırdaki döküm çoğu yerel ayar için kaydedilmelidir.


16
Bu konuda denenmemiş açıklama: için Javadoc getDecimalFormatSymbols()diyor: Returns: a copy of the desired DecimalFormatSymbols. Bu yüzden setDecimalFormatSymbols(theCopy)kopyayı değiştirdikten sonra kullanmalısınız .
java.is.for.desktop

6
Bd.longValue () için dokümanlar "herhangi bir kesirli kısım atılacak" diyor. Dolayısıyla, hassasiyeti önemsiyorsanız bunu yapmanın en iyi yolu bu mu bilmiyorum
kodlama kullanıcısı

2
Sanırım kullanabilir newve biçimlendiriciye geri döndürebilirsiniz: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

Grup ayırıcı olarak \ u00a0 (bölünmeyen boşluk) kullanmak isteyeceğinizi düşünüyorum. Bazı yerel ayarlar için varsayılandır.
ACV

3
Neden longValue diyorsunuz? Soru BigDecimal için binlerce operatör ayarlamaktı, uzun değil.
FINDarkside

232

Biçim işlevini "," ile kullanabilirsiniz;

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

//str = 124,750

"," yerel ayara özgü gruplama karakterlerini içerir.

docs


11
.Bir ayırıcı olarak kullanmak istersem ne olur ?
Enissay

Genellikle String.format kullandığım için benim için en iyisi ve en kolayı bu!
Ali

17
Çağrı @Enissay format()açık bir yerel ayarıyla ( Local.USkullanım bilinen ,ayırıcı olarak) ve daha sonra değiştirmek ,özel ayırıcı ile: String.format(Locale.US, "%,d", n).replace(',', '.').
minipif

java.util.IllegalFormatConversionException:% d java.lang.String bağımsız değişkenlerini biçimlendiremiyor
Iman Marashi

1
@ImanMarashi Bir int. Veya a long. Veya a BigInteger. Ve double, floatveya kullanmak istiyorsanız f kullanın BigDecimal.
Adowrath

57
BigDecimal bd = new BigDecimal(300000);

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

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

DÜZENLE

Boşluk gibi özel gruplama ayırıcısı almak için şunu yapın:

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

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));

DecimalFormatSymbols setGroupingSeparator'ı kullanmam gerektiğini biliyorum, ancak bunu BigDecimal
Funtime

1
@Funtime: "BigDecimal'inize uygulamazsınız". NumberFormatİstenilen özelliklere sahip bir nesne oluşturursunuz ve bunu BigDecimal. A BigDecimalyalnızca belirli bir değere sahiptir, belirli bir biçime sahip değildir .
Joachim Sauer

1
Binlik

2. seçenekteki en üst satırı DecimalFormatSymbols sembolleri olarak değiştirmek zorunda kaldı = new DecimalFormatSymbols (); bunun işe yaraması için.
PaperThick

14

Brezilya'da kullanıldığı gibi biçimlendirmek için bu kodu deneyin:

    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
Siz de JasperReports durumunda, formatı doğru zorlayarak bunu deneyin: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); Bu parametreyi rapora gönderin.
dellasavia

8

Tamsayı veri türü için binlik ayırıcı kullanıyorsanız 1'i kullanın.

  1. Tamsayı veri türü için

String.format ("%, d \ n", 58625) ve çıktı 58.625 olacaktır

  1. Kayan Nokta veri Türü için String.format ("% ,. 2f", 58625.21) ve çıktı 58.625,21 olacaktır

Bu bir aydınlanma idi. Ancak, gerçekten "," nin grup ayırıcı olarak kullandığı karakter değil, yalnızca bir bayrak olduğunu vurgulamalısınız. (Sorunu bulmam biraz zaman aldı.) Bkz. 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

Kabul edilen cevap gerçekten değiştirilmelidir, aksi takdirde işe yaramaz. GetDecimalFormatSymbols bir savunma kopyasını yapar. Böylece,

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

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

Yeni satır şudur: formatter.setDecimalFormatSymbols (semboller);


2

İçin ondalık :

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

Yukarıda belirtildiği gibi, aşağıdaki bağlantı , Java'nın numarayı yerelleştirmesine izin vermek için size belirli ülke kodunu verir. Her ülkenin kendi tarzı vardır.

Yukarıdaki bağlantıda, buraya yerleştirilmesi gereken ülke kodunu bulacaksınız:

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

Örneğin İsviçre, sayıları aşağıdaki gibi biçimlendirir:

1000,00 -> 1'000,00

ülke kodu

Bunu başarmak için aşağıdaki kodlar benim için çalışıyor:

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

Sonuç beklendiği gibi:

1'000.00

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

formatStr(2524.2) // 2,254.20



Bu kod soruya bir çözüm sunabilirken, neden / nasıl çalıştığına ilişkin bağlam eklemek daha iyidir. Bu, gelecekteki kullanıcıların öğrenmesine ve bu bilgiyi kendi kodlarına uygulamasına yardımcı olabilir. Ayrıca, kod açıklandığında kullanıcılardan olumlu oylar şeklinde olumlu geri bildirimler almanız da muhtemeldir.
borchvm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.