दशमलव के विभाजक को कॉमा से बिंदु / बिंदु तक कैसे बदलें?


204

मेरे पास यह छोटी सी पागल विधि है जो बिगडेसिमल मूल्यों को अच्छे और पठनीय स्ट्रिंग्स में परिवर्तित करती है।

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

हालाँकि, यह एक तथाकथित समूहन विभाजक ","भी बनाता है जो मेरे सभी मूल्यों को इस तरह से सामने लाता है:

xxx,xxx

मुझे विभाजक की जरूरत है एक बिंदु या बिंदु और एक अल्पविराम नहीं। क्या किसी के पास इस छोटे से करतब को पूरा करने का कोई सुराग है?

मैंने पढ़ा है इस और विशेष रूप से इस अब मौत के लिए, लेकिन मैं इस किया पाने के लिए एक तरह से नहीं मिल रहा। क्या मैं इसे गलत तरीके से देख रहा हूं? क्या ऐसा करने का बहुत अधिक सुरुचिपूर्ण तरीका है? शायद यह भी एक समाधान है कि विभिन्न स्थानीय संख्या प्रतिनिधित्व के लिए खाता है, क्योंकि अल्पविराम यूरोपीय मानकों द्वारा परिपूर्ण होगा।


जवाबों:


323

आप विभाजक को या तो लोकेल सेट करके या DecimalFormatSymbols का उपयोग करके बदल सकते हैं ।

यदि आप समूहन विभाजक को एक बिंदु बनाना चाहते हैं, तो आप एक यूरोपीय स्थान का उपयोग कर सकते हैं:

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

वैकल्पिक रूप से आप स्वरूप विधि द्वारा निर्मित स्वरूपित संख्याओं में दिखाई देने वाले प्रतीकों को बदलने के लिए DecimalFormatSymbols वर्ग का उपयोग कर सकते हैं। इन प्रतीकों में दशमलव विभाजक, समूहीकरण विभाजक, माइनस साइन और अन्य लोगों के बीच प्रतिशत चिह्न शामिल हैं:

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

currentLocale को Locale.getDefault () से प्राप्त किया जा सकता है:

Locale currentLocale = Locale.getDefault();

1

मैंने अन्यSymbols.setDecimalSeparator (',') को बदल दिया है; अन्य के रूप मेंसंबलसेटसेटडिसिमलसेपरेटर ('।'); धन्यवाद। यह मेरे लिए काम करता है।
आकांक्षा

2
यह कैसे प्रारूप लगता है, जैसे है String formatString = "#,###,###,##0.00";देखना docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html वाक्य रचना के लिए
Vulpo

1
"आप एक यूरोपीय स्थान का उपयोग कर सकते हैं"। ठीक है, आप यूरोप से किसी भी लोकेल का उपयोग नहीं कर सकते क्योंकि Locale.UKवापस 1,567.90 नहीं आएगा और 1.567,90
जूनियर मेहे

साइड नोट: NumberFormat.getNumberInstance()कुछ एंड्रॉइड 7 उपकरणों पर असामान्य रूप से धीरे-धीरे चल सकता है। एक विकल्प है String.format()जो जल्दी से चलता है। देखें stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE

14

यूरोप काफी विशाल है। मुझे यकीन नहीं है कि अगर वे एक ही प्रारूप का उपयोग करते हैं। हालाँकि यह या यह उत्तर मदद का होगा।

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

यानी सही लोकेल का इस्तेमाल करें।


1
वास्तव में श्रीमान! यूके में "£ 1,234.00" देखा जाना है, जबकि फ्रांस में "1 234,00 €" अपेक्षित है (समूह विभाजक, दशमलव विभाजक, मुद्रा प्रतीक और मुद्रा स्थिति बदल गई है)।
वुल्पो

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

5

BigDecimal लोकेल सेटिंग्स का सम्मान नहीं करता है।

Locale.getDefault(); //returns sl_SI

स्लोवेनियाई लोकेल में एक दशमलव अल्पविराम होना चाहिए। लगता है कि मुझे संख्याओं के बारे में अजीब गलतफहमी थी।

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

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

मैंने अपने संदेश के एक हिस्से को संपादित किया है जिसका कोई मतलब नहीं है क्योंकि यह मानव त्रुटि के कारण साबित हुआ (डेटा करना भूल गया था और गलत चीज़ को देख रहा था)।

BigDecimal के रूप में भी किसी भी जावा .toString () फ़ंक्शन के लिए कहा जा सकता है। मुझे लगता है कि यह कुछ मायनों में अच्छा है। उदाहरण या डिबगिंग के लिए क्रमिकरण। एक अद्वितीय स्ट्रिंग प्रतिनिधित्व है।

फॉर्मेटर्स का उपयोग करने वाले अन्य लोग भी ठीक काम करते हैं। बस फॉर्मेटर्स का उपयोग करें, जेएसएफ फ्रंटेंड के लिए, फॉर्मेटर्स ठीक से काम करते हैं और लोकेल से अवगत होते हैं।


3
String money = output.replace(',', '.');

6
संख्या अरबी प्रारूप में हो सकती है, और वे एक और विभाजक का उपयोग करते हैं: (ic) (हेक्स यू + 066 बी में)। en.wikipedia.org/wiki/Decimal_mark#Other_numeral_systems नंबर भी अलग-अलग हैं: en.wikipedia.org/wiki/Arabic_(Unicode_block)
mckal
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.