DecimalFormat'ın ondalık ayırıcısını virgülden nokta / noktaya nasıl değiştirebilirim?


204

Ben güzel ve okunabilir Dizeler BigDecimal değerleri dönüştüren bu küçük deli yöntemi var.

private String formatBigDecimal(BigDecimal bd){
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(3);
    df.setMaximumFractionDigits(3);
    df.setMinimumIntegerDigits(1);
    df.setMaximumIntegerDigits(3);
    df.setGroupingSize(20);
    return df.format(bd);
}

Ancak, ","tüm değerlerimi şu şekilde ortaya çıkaran gruplama ayırıcısı da üretir :

xxx,xxx

Bir virgül değil nokta veya nokta olmak için ayırıcıya ihtiyacım var. Bu küçük başarıyı nasıl başaracağına dair bir ipucu var mı?

Okudum bu ve özellikle bu şimdi ölüme ama bu gerçekleştirmeye yönelik bir yol bulmak mümkün değil. Buna yanlış mı yaklaşıyorum? Bunu yapmanın çok daha zarif bir yolu var mı? Hatta virgül Avrupa standartlarına göre mükemmel olacağından, farklı yerel sayı gösterimlerini açıklayan bir çözüm bile olabilir.


Yanıtlar:


323

Ayırıcıyı bir yerel ayar ayarlayarak veya DecimalFormatSymbols kullanarak değiştirebilirsiniz .

Gruplama ayırıcısının bir nokta olmasını istiyorsanız, bir Avrupa yerel ayarını kullanabilirsiniz:

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;

Alternatif olarak, format yöntemi tarafından üretilen biçimlendirilmiş sayılarda görünen sembolleri değiştirmek için DecimalFormatSymbols sınıfını kullanabilirsiniz. Bu semboller, diğerleri arasında ondalık ayırıcı, gruplandırma ayırıcı, eksi işareti ve yüzde işaretini içerir:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

currentLocale , Locale.getDefault () öğesinden edinilebilir, yani:

Locale currentLocale = Locale.getDefault();

1

OtherSymbols.setDecimalSeparator (',') değiştirdim; otherSymbols.setDecimalSeparator ('.') gibi; Teşekkürler. Benim için çalışıyor.
Aakanksha

2
biçim böyle görünür, örneğin sözdizimi için docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html adresineString formatString = "#,###,###,##0.00"; bakın
55'te Vulpo

1
Msgstr "Avrupa yerel ayarı kullanabilirsiniz". Avrupa'dan herhangi bir yerel ayar kullanamazsınız çünkü Locale.UKgeri dönecek 1,567.90 ve 1.567,90 değil
Junior Mayhé

Yan not: NumberFormat.getNumberInstance()bazı Android 7 cihazlarda alışılmadık şekilde yavaş çalışabilir. Bir alternatif String.format()hızlı bir şekilde çalışır. Bkz. Stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE

14

Avrupa oldukça büyük. Her yerde aynı biçimi kullanıp kullanmadığından emin değilim. Ancak bu ya da bu cevap yardımcı olacaktır.

String text = "1,234567";
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = nf_in.parse(text).doubleValue();

NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
nf_out.setMaximumFractionDigits(3);
String output = nf_out.format(val);

Doğru yerel ayarı kullanıyorum.


1
Gerçekten efendim! İngiltere'de "1.234,00 £" görülmekle birlikte, Fransa'da "1 234,00 €" bekleniyor (grup ayırıcı, ondalık ayırıcı, para birimi simgesi ve para birimi konumu değişti).
Vulpo

9
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}

5

BigDecimal, Yerel ayarlara uymuyor gibi görünüyor.

Locale.getDefault(); //returns sl_SI

Sloven yerel ayarı ondalık virgül içermelidir. Sanırım sayılarla ilgili garip yanılgılarım oldu.

a = new BigDecimal("1,2") //throws exception
a = new BigDecimal("1.2") //is ok

a.toPlainString() // returns "1.2" always

Mesajımın insan hatasından kaynaklandığını kanıtladığı için mantıklı olmayan bir kısmını düzenledim (veri işlemeyi unuttum ve yanlış şeye bakıyordum).

BigDecimal ile aynı herhangi bir Java .toString () işlevi için söylenebilir. Sanırım bu bazı açılardan iyi. Örneğin serileştirme veya hata ayıklama. Benzersiz bir dize gösterimi vardır.

Ayrıca biçimlendiriciler kullanılarak bahsedilen diğerleri iyi çalışıyor. Sadece JSF ön ucunda olduğu gibi formatlayıcılar kullanın, formatlayıcılar işi düzgün yapar ve yerel ayarın farkındadır.


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.