जावा में दशमलव विभाजक के रूप में बल बिंदु ("।")


103

मैं वर्तमान में एक डबल प्रिंट करने के लिए निम्न कोड का उपयोग करता हूं:

return String.format("%.2f", someDouble);

यह अच्छी तरह से काम करता है, सिवाय इसके कि जावा मेरे लोकेल के दशमलव विभाजक (अल्पविराम) का उपयोग करता है जबकि मैं एक बिंदु का उपयोग करना चाहूंगा। क्या इसे करने का कोई आसान तरीका है?


यदि आपको सटीक दशमलव के साथ दोहरे मूल्य का उपयोग करने की आवश्यकता है, तो शायद आपको डबल / डबल के बजाय बिगडेसिमल का उपयोग करना चाहिए। दोहरे चर का उपयोग करते समय आपके सामने आने वाली समस्याओं के लिए यह लिंक देखें । आप इसे भी आज़मा सकते हैं: System.out.println (5.1d + 1.1d); - रिजल्ट 6.2 की जगह 6.199999999999999 होगा। मुझे लगता है कि किसी को स्ट्रिंग के रूप में दशमलव के साथ संख्याओं को प्रारूपित करने के तरीके पर विचार करना चाहिए।
रज़वानोन

जवाबों:


172

ओवरलोड का उपयोग करें String.formatजिससे आप लोकेल निर्दिष्ट कर सकें:

return String.format(Locale.ROOT, "%.2f", someDouble);

यदि आप केवल एक संख्या को प्रारूपित कर रहे हैं - जैसा कि आप यहाँ हैं - तो उपयोग NumberFormatकरना संभवतः अधिक उचित होगा। लेकिन अगर आपको बाकी प्रारूपण क्षमताओं की आवश्यकता है String.format, तो यह ठीक काम करना चाहिए।


6
Locale.ROOT अधिक तटस्थ है।
स्पीडगू

@speedogoo: संपादित, हालाँकि मुझे संख्या स्वरूपण के लिए संदेह है, इससे कोई फ़र्क नहीं पड़ता।
जॉन स्कीट

1
हाँ, लेकिन आपको यूएस और यूके के बीच चयन करने की आवश्यकता नहीं है। 😜
speedogoo

2
Locale.ROOT दशमलव विभाजक की देश की पसंद में संभावित भविष्य के परिवर्तनों के विरुद्ध भी सुरक्षित है।
अत्तिला तानी

IMO इस सवाल का जवाब नहीं देता है, बल्कि Locale.setDefault (नया लोकेल ("एन", "यूएस")); जैसा कि एक अन्य उत्तर में बताया गया है। यह सच है कि हो सकता है कि इसके अवांछनीय दुष्प्रभाव हों क्योंकि यह वैश्विक है, OTH प्रोग्रामर के रूप में जो मैं वास्तव में चाहता हूं वह यह है कि वैश्विक डिफ़ॉल्ट यूएस है क्योंकि मेरे कोड में हर जगह और जहां मैं लोकेल के बारे में परवाह करता हूं वह स्पष्ट रूप से करता हूं।
nyholku

21

एक अधिक कठोर समाधान अपने लोकेल को मुख्य () में जल्दी सेट करना है।

पसंद:

Locale.setDefault(new Locale("en", "US"));

11
यह एक बहुत समस्याग्रस्त उत्तर है, क्योंकि इसका वैश्विक प्रभाव है, इस प्रकार बहुत सारे अन्य (संभवतः अवांछनीय) परिवर्तन हो सकते हैं।
sleske

2
IMO यह प्रश्न का सही उत्तर है और प्रोग्रामर के रूप में यह वही है जो मैं चाहता हूं। मैं चाहता हूं कि जावा मेरे कोड में हर जगह डिफ़ॉल्ट रूप से यूएस लोकेल का उपयोग करे जहां मुझे वास्तव में स्थानीयकरण की आवश्यकता है मैं इसे अपने कोड में स्पष्ट कर दूंगा। शायद मेरी आदतें लेकिन यह बहुत कष्टप्रद है जब प्रिंटफ / प्रारूप मेरे स्थानीय लोकेल कारण का उपयोग करता है तो दशमलव 'अल्पविराम' अन्य सॉफ़्टवेयर (मैटलैब किसी) के साथ पूरी तरह से असंगत है जो मैं उपयोग करता हूं।
निहलोकू '

10

आप java.lang.String.format के साथ-साथ java.io.PrintStream.printf (जैसे System.out.printf ()) पर एक अतिरिक्त लोकेल पास कर सकते हैं:

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

इसका परिणाम निम्नलिखित है (मेरे पीसी पर):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

जावा API में String.format देखें ।


4
आप स्थानीय स्वतंत्र प्रतिनिधित्व प्राप्त करने के लिए भी उपयोग कर सकते हैं out.printf((Locale)null, ...)या कर सकते हैं out.format((Locale)null, ...)। (और वहाँ भी है Locale.ROOT)
eckes

10

रास्ता बहुत देर से लेकिन जैसा कि यहाँ बताया गया है NumberFormat(और इसके उपवर्ग का नमूना है DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

मेरा ऐसा मानना ​​है कि DecimalFormatSymbolsइस विधि से पहले, विभाजक को बनाने और स्थापित करने का काम एक बार किया जाना चाहिए।
लाइन

0

आप NumberFormat और DecimalFormat का उपयोग कर सकते हैं।

इस लिंक पर एक नजर डालते हैं जावा ट्यूटोरियल लोकेलेसिक फॉर्मेटिंग से

लोकेल-सेंसिटिव फॉर्मेटिंग नामक सेक्शन की आपको आवश्यकता है।


-3

मेरे पास एक ही मुद्दा था .. में 55.1बदल गया 55,10। मेरा त्वरित (गंदा?) फिक्स है:

String.format("%.2f", value).replaceAll(",",".");


1
यह तभी तक काम करता है जब तक कि कोई आपके कोड को किसी अलग लोकेल में चलाने की कोशिश न करे। वास्तविक समाधान नहीं। -1
मार्को फ्रायडेनबर्गर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.