2012-09-24 15 views
12

हैलो मुझे एक लंबे (सेंट) को मुद्रा प्रारूप में परिवर्तित करने में समस्या आ रही है।जावा कनवर्टिंग लंबे समय तक मुद्रा में

मेरे कोड:

long doublePayment = 1099; //Should equal $10.99 
DecimalFormat dFormat = new DecimalFormat(); 
String formattedString = dFormat.format(doublePayment); 
System.out.println(formattedString); 

आउटपुट: 1,099

मैं भी करने की कोशिश की:

long doublePayment = 1099; 
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment); 
System.out.println(s); 

इस के बाद से सेंट है, उत्पादन 10.99 या $ 10.99 होना चाहिए।

पता लगाएं कि मैं क्या गलत कर रहा हूं। धन्यवाद!!!

+0

ओह क्षमा करें मुझे नहीं पता कि मेरा कोड "CodeFormat" में क्यों नहीं आया था, इसलिए पहले से खेद है। – mcd

+0

क्योंकि आपको कोड से पहले एक नई लाइन की आवश्यकता है; मैंने इसे आपके लिए ठीक कर दिया है। – Jesper

+1

एफवाईआई, आपको मुद्रा के लिए बिगडिसीमल का उपयोग करना चाहिए: http://stackoverflow.com/questions/285680/representing-monetary-values-in-java – wulfgarpro

उत्तर

18

डॉलर सेंट परिवर्तित करने के लिए आप

long doublePayment = 1099; 
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment/100.0); 
System.out.println(s); 

उपयोग कर सकते हैं यह $ 70 ट्रिलियन तक सटीक हो जाएगा।

+0

मदद – mcd

+0

के लिए धन्यवाद मैंने कोशिश की थी कि मैंने पहले क्या सोचा था, लेकिन "x/100" को यह भी सोचने की कोशिश नहीं की कि "x/100.0" – mcd

+1

से अलग है हां, एक पूर्णांक द्वारा विभाजित एक पूर्णांक आपको एक पूर्णांक देता है। यह आपको एक डबल वास्तव में देना चाहिए जिसे आप पूर्णांक विभाजन के लिए पूर्णांक में डाल सकते हैं, लेकिन आपको डबल प्राप्त करने के लिए कम से कम डबल/पूर्णांक या पूर्णांक/डबल होना चाहिए। –

0

double doublePayment = 10.99; आपको इस तरह की मुद्रा प्रदान करने की आवश्यकता है। NumberFormat यह समझ नहीं पाएगा कि आप इसे सेंट्स या $ में प्रदान कर रहे हैं, जब तक कि यह दशमलव बिंदु

0

स्वरूपण के साथ कोई समस्या नहीं है, यह इनपुट के साथ एक समस्या है। 100 से अपने इनपुट को विभाजित करें और आप सभी सेट हो जाएंगे।

float payment = 1099/((float) 100); 
+0

मैं फ्लोट के बजाए डबल का उपयोग करूंगा क्योंकि कम प्रतिनिधित्व त्रुटि होगी। यानी 'डबल भुगतान = 10 99/100.0;' –

0

उपयोग मुद्रा फ़ॉर्मेटर:

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.ENGLISH); 
String output = nf.format(value); 
System.out.println(value + " " + output); 
6

आपका शाब्दिक जो एक हजार और निन्यानबे है, पूर्णांक शाब्दिक के लिए जावा नियमों के साथ मुकाबला करने 1099 है। आपके JVM लोकेल के अनुसार, यह संख्या 1,099 के साथ प्रदर्शित होती है। यदि आप यूरोप में थे, तो यह 1.099 होगा। इसलिए, यह आपके आउटपुट के साथ कोई समस्या नहीं है, लेकिन आपके इनपुट के साथ।

समस्या यह है कि आपको निश्चित बिंदु मान का प्रतिनिधित्व करना है, लेकिन आपको java.math.BigDecimal पता नहीं है और इसे नकली करने का प्रयास करें। जब आप कुछ गणना करेंगे तो चीजें टूट जाएंगी। ऐसा मत करो

यही वह है जो आपको करना है। सीधे शब्दों में (यह अब तक कम कोड, भी है):

BigDecimal payment = new BigDecimal("10.99"); 
System.out.println(String.format("$%.2f", payment)); 

नोट कैसे तुम सच में एक स्ट्रिंग के साथ एक संख्या initailize। इसके अलावा, String.format() देखभाल of the current locale पर ले जाएगा, या आप ओवरलोडेड विधि के माध्यम से आवश्यक एक की आपूर्ति कर सकते हैं।

+3

केस हो सकता है कि डेविड के सेंट का लंबा मूल्य है, तो उसे नए बिगडेसिमल (डबलपेमेंट) का उपयोग करना चाहिए। movePointLeft (2); – Lauri

22

यदि आपके साथ शुरुआत करने में लंबा समय है, तो आपको अभी भी java.math.bigDecimal का उपयोग करना चाहिए।

long doublePayment = 1099; 
    BigDecimal payment = new BigDecimal(doublePayment).movePointLeft(2); 
    System.out.println("$" + payment); // produces: $10.99 

दें यह एक बार फिर ज़ोर से कहा जा: एक फ्लोटिंग प्वाइंट चर का उपयोग कभी नहीं होना चाहिए पैसा/मुद्रा का मान संग्रहीत।

+1

अधिकांश निवेश बैंकों को छोड़कर 'डबल' का उपयोग करें। सी या सी ++ में कोई बिगडिसीमल नहीं है और फिर भी बहुत सी प्रणाली सी या सी ++ का उपयोग करती है। ;) –

+3

मुझे लगता है कि बैंक सेंट्स या संतों के अंशों को स्टोर करने के लिए कुछ पूर्णांक या लंबे रूप का उपयोग करते हैं, क्योंकि फ्लोटिंगपॉइंट अंकगणित मामूली त्रुटियों का उत्पादन करता है, जिन्हें बैंकिंग सिस्टम में अनुमति नहीं है। – Lauri

+2

मामूली त्रुटियां यादृच्छिक त्रुटियां नहीं हैं। आप भविष्यवाणी कर सकते हैं कि वे कितने बड़े हो सकते हैं और उचित गोलिंग का उपयोग कर सकते हैं। आप सही हैं और int का भी उपयोग किया जाता है, लेकिन ये कम आम IMHO हैं। मैं इस बात से सहमत हूं कि यदि आप उचित गोल करने का उपयोग नहीं करते हैं, तो BigDecimal का उपयोग करें। –

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