2011-03-30 8 views
5

मैं संभावित रूप से दशमलव मान के साथ प्रीफ़िक्स्ड संभावित दशमलव दशमलव को केवल संख्यात्मक मान में परिवर्तित करना चाहता हूं।
उदाहरण के लिए -
मूल्य निम्नलिखितसंख्या चिह्न के साथ संख्यात्मक मान को संख्यात्मक रूप से कनवर्ट करना संख्याफॉर्मैट

String s1 = "£32,847,676.65"; 
String s2 = "£3,456.00"; 
String s3 = "£831,209"; 

के किसी भी तरह हो सकता है मैं परिणाम चाहते हैं रूपांतरण के बाद की तरह बनना - 32847676.65, 3456.00 और 831209
मैं इस तरह से NumberFormat की parse() विधि का उपयोग करने की कोशिश की -

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.UK); 
numberFormat.setMinimumFractionDigits(2); 
Number num = nf.parse(s1); 
double dd = num.doubleValue(); 
BigDecimal gg = new BigDecimal(dd); 
System.out.println(gg); 

लेकिन परिणाम है - जो काफी बिल्कुल सही नहीं है 32847676.649999998509883880615234375

मुझे इसे संख्यात्मक होने की आवश्यकता है ताकि मैं किसी प्रकार की गणना कर सकूं।
क्या आप लोग मुझे मार्गदर्शन कर सकते हैं कि मैं

उत्तर

5

पर पहले से ही मूल्य का विश्लेषण कर सकता हूं।

BigDecimal gg = new BigDecimal(dd); 

आप BigDecimal के लिए मूल्य covnert, और युगल के पूर्णांकन समस्याओं डॉट के बाद दशमलव स्थानों के लिए हैं: समस्या यह है। उपयोग:

BigDecimal gg = new BigDecimal(dd).setScale(2); 

या

BigDecimal gg = new BigDecimal(dd).setScale(2,RoundingMode.HALF_UP); 
+0

क्षमा करें, यह काम नहीं करता है। अगर मैं 'gg.toString()' या 'gg.toPlainString()' sysout के परिणामस्वरूप '3.3E + 7' और' 33000000' –

+0

@ स्विफ्ट-टटल में क्षमा करें: क्षमा करें, कृपया इस संस्करण को – Daniel

+0

हाँ, RoundingMode के साथ आजमाएं सही काम करता है। बहुत बहुत धन्यवाद। की सराहना की। स्पष्टीकरण के लिए –

5

जब BigDecimal के साथ खेल, उचित निर्माता है BigDecimal (स्ट्रिंग वैल)

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.UK); 
    BigDecimal gg = new BigDecimal(nf.parse(s1).toString()); 
    System.out.println(gg); 

BigDecimal (डबल वैल) एक सटीक निर्माण करता है डबल मान का दशमलव प्रतिनिधित्व, जो आपके द्वारा अपेक्षित मानव पठनीय मूल्य नहीं है।

"इस कन्स्ट्रक्टर का परिणाम कुछ हद तक अप्रत्याशित हो सकता है। कोई यह मान सकता है कि जावा में नया बिगडिसीमल (0.1) लिखना एक बिगडिसीमल बनाता है जो 0.1 के बराबर है (1 का स्केल 1, 1 के पैमाने के साथ) लेकिन यह वास्तव में 0.1000000000000000055511151231257827021181583404541015625 के बराबर है। ऐसा इसलिए है क्योंकि 0.1 को एक डबल (या, उस मामले के लिए, किसी भी सीमित लंबाई के बाइनरी अंश के रूप में) के रूप में प्रदर्शित नहीं किया जा सकता है। इस प्रकार, निर्माता को जो मूल्य पारित किया जा रहा है वह नहीं है वास्तव में 0.1, दिखावे के होते हुए भी करने के लिए बराबर [...] इसलिए, यह आम तौर पर की सिफारिश की है कि स्ट्रिंग निर्माता यह एक "

स्रोत को वरीयता में इस्तेमाल किया जा:। BigDecimal javadoc

+0

धन्यवाद। लेकिन समस्या यह है कि नंबरफॉर्मैट की 'पार्स()' विधि की वापसी एक 'संख्या' है। तो अगर किसी भी तरह से मैं परिणाम को 'स्ट्रिंग' में परिवर्तित करने में सक्षम हूं, तो मैं बिगडिसीमल का भी उपयोग नहीं कर सकता, यह समस्या यहां नहीं है। –

+0

मेरी पिछली टिप्पणी आपके कोड स्निपेट से पहले थी। हाँ यह काम करता है। फिर भी, मुझे आश्चर्य है कि क्या मैं 'स्ट्रिंग एस 2 = "£ 3,456.00" के लिए दशमलव स्थान प्राप्त कर सकता हूं; '। हालांकि धन्यवाद। –

+0

मुझे बिगडिसीमल उपयोग के बिना इसे कैसे करना है इस पर एक नज़र डालेंगे :) – Tanguy

0

आप BigDecimal या NumberFormat के बिना निम्न का प्रयास कर सकते हैं। ;)

String s1 = "£32,847,676.65"; 
// remove the £ and , 
String s2 = s1.replaceAll("[£,]", ""); 
// then turn into a double 
double d = Double.parseDouble(s2); 
// and round up to two decimal places. 
double value = (long) (d * 100 + 0.5)/100.0; 

System.out.printf("%.2f%n", value); 

प्रिंट

32847676.65 

youw चींटी अपनी गणना में पूर्णांकन त्रुटि से बचने के लिए, लेकिन नहीं करना चाहती भारी वजन आप long सेंट उपयोग कर सकते हैं BigDecimal हैं।

// value in cents as an integer. 
long value = (long) (d * 100 + 0.5); 

// perform some calculations on value here 

System.out.printf("%.2f%n", value/100.0); 
+0

वैसे यह काफी सरल समाधान है लेकिन मुझे आश्चर्य है कि यह एक अच्छा समाधान है। मुझे परेशान न करें, मेरा मतलब है कि आप जानते हैं कि कभी-कभी हम ओओ या शुद्ध प्रोग्रामिंग दृष्टिकोण के बजाय तथाकथित गंदे समाधान का उपयोग करते हैं। –

+0

कई डेवलपर्स के पास एक नियम है कि जब भी आपके पास पैसा होता है, तो BigDecimal का उपयोग करें। हालांकि, मैंने जिन सभी बैंकों के साथ काम किया है, वे डबल या int/long का उपयोग करते हैं। –

0

यह काम करने के लिए गारंटी नहीं है, लेकिन NumberFormat API दस्तावेज़ के अनुसार, इसके getXyzInstance तरीकों "स्थानों के विशाल बहुमत के लिए" एक DecimalFormat उदाहरण वापस आ जाएगी। इसे संभवतः "सभी लोकेशंस के लिए" के रूप में व्याख्या किया जा सकता है, जब तक मालिकाना लोकेल सेवा प्रदाता स्थापित नहीं होते हैं "।

आप DecimalFormat करने के लिए अपने NumberFormat डाल सकता है, तो आप सीधे एक BigDecimal को पार्स करने के लिए, करने के लिए अपने कोड को कम करने के लिए यह बता सकते हैं:

DecimalFormat nf = (DecimalFormat) NumberFormat.getCurrencyInstance(Locale.UK); 
nf.setParseBigDecimal(true); 
BigDecimal gg = (BigDecimal) nf.parse(s1); 
System.out.println(gg); 

इस मामले में, आप द्विआधारी की अशुद्धि के साथ कोई समस्या नहीं होगा दशमलव संख्याएं।

संबंधित मुद्दे