2009-04-06 17 views
17

यह मुझे पागल कर रहा है। मेरे पास ASP.NET 2.0 वेबफॉर्म पृष्ठडबल। पर्स - अंतर्राष्ट्रीयकरण समस्या

string s = "0.009"; 

में निम्न स्ट्रिंग है। अब, अगर मेरी संस्कृति स्पेनिश है - जो कि "es-ES" - और मैं डबल करने के लिए स्ट्रिंग बदलने की कोशिश, मैं निम्नलिखित है:

double d = Double.Parse(s, new CultureInfo("es-ES")); 

मैं क्या उम्मीद थी 0009 है। इसके बजाय, मुझे 9 मिलते हैं। मैं समझता हूं कि .NET सोचता है कि यह एक हजार विभाजक है, जो एन-यूएस में अल्पविराम है, लेकिन इसे संस्कृति की जानकारी नहीं लेनी चाहिए जो मैं पार्स विधि में जा रहा हूं और सही प्रारूप लागू करता हूं रूपांतरण?

तो मुझे क्या करना

double d = 0.009D; 
string formatted = d.ToString(new CultureInfo("es-ES")); 

स्वरूपित अब 0009 है। कोई?

+1

अधिक जानकारी स्थानीयकरण के साथ कई अन्य मुद्दों जैसे http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

उत्तर

20

यह आपके द्वारा दी गई संस्कृति को लेना और सही स्वरूपण लागू करना है। आपने "0.00 9" की एक स्ट्रिंग प्रदान की और कहा कि यह स्पेनिश था ... फिर आप शिकायत करते हैं कि इसे उचित रूप से स्पेनिश के रूप में व्याख्या किया गया है! यह मत कहो कि स्ट्रिंग स्पेनिश है जब आप जानते हैं कि यह नहीं है।

आपको पार्स विधि को पारदर्शी स्ट्रिंग की संस्कृति को पारित करना चाहिए, जो इस मामले में एन-यूएस या एन-जीबी या इनवेरिएंटकल्चर होगा।

+0

हाँ, मुझे यह सब गलत मिला। उत्तर के लिए धन्यवाद दोस्तों। यह वास्तव में सहायक था। –

+0

कोई समस्या नहीं है। मैं हमेशा मदद करने में खुश हूं। क्षमा करें अगर मेरा जवाब थोड़ा तेज हो गया - यह उस तरह से इरादा नहीं था, लेकिन अब इसे फिर से पढ़ रहा है, ऐसा लगता है कि मैं सही गिट हूं। –

4

आपके पास यह पीछे है।

जब आप double d = Double.Parse(s, new CultureInfo("es-ES")); कहते हैं, तो आप अपनी स्ट्रिंग को दो बार में पार्स करने के लिए .NET से पूछ रहे हैं, यह मानते हुए कि स्ट्रिंग ईएस-ईएस संस्कृति में लिखी गई है।

स्पेनिश संस्कृति में, "।" एक हजार विभाजक है, इसलिए "0.00 9" 9 है।

जब आप ToString() का उपयोग करके कनवर्ट करते हैं, तो यह कहता है कि स्पेनिश संस्कृति का उपयोग करके 0.00 9 को एक स्ट्रिंग में परिवर्तित करना है, इसलिए यह दशमलव विभाजक के रूप में "," का उपयोग करता है , और आपको "0,009" मिलता है। व्यवहार सही है।

मेरा अनुमान है कि आप Invariant संस्कृति के साथ Double.Parse का उपयोग करना चाहते हैं, और स्पेनिश संस्कृति के साथ ToString, तो 0.00 9 0,009 बन जाता है।

2

आप पार्सिंग और स्वरूपण गलत कर रहे हैं। आपको पहली बार 200 9 की बजाय 9 मिलती है क्योंकि आप पहली बार एक स्ट्रिंग लेते हैं जो एक-आधारित संस्कृति में बनाई गई है और इसे एक-आधारित संस्कृति का उपयोग करके पार्स करें। आपको जिस भी संस्कृति के साथ बनाया गया था उसका उपयोग करके इसे पार्स करने की आवश्यकता है और उसके बाद आप जिस भी संस्कृति को प्रदर्शित करना चाहते हैं उसका उपयोग करके इसे प्रारूपित करना होगा।

3

मुझे लगता है कि आप इसे गलत तरीके से व्याख्या कर रहे हैं, ईएस-ईएस संस्कृति 0.00 9 में वास्तव में 9 कहने का एक लंबा रास्ता है। " दशमलव विभाजक नहीं है, इसलिए यदि आप स्ट्रिंग के लिए पूछते हैं तो ईएस-ईएस संस्कृति के साथ आपको वास्तव में दोगुना 9.0 मिलना चाहिए। यदि आप इसे "0,009" पार्स करने के लिए कहते हैं तो आपको 0.00 9 का दोगुना होना चाहिए।

इसी प्रकार, यदि आप इसे प्रारूप पर पूछते हैं तो डबल 0.00 9 आपको ईएस-ईएस में स्ट्रिंग "0,009" मिलनी चाहिए।

1
double d = Double.Parse("0,009", 
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
    CultureInfo.CreateSpecificCulture("es-ES")); 

es-ES संस्कृति में "," एक दशमलव seporator (नहीं "।")

10

क्या जेस के लेखन मेरे लिए काम करता है।बस किसी को जो कैसे "अपरिवर्तनीय संस्कृति" पाने के लिए बाहर की कोशिश नहीं करनी के लिए: यह इस

double d = Double.Parse(myString, CultureInfo.InvariantCulture);

(पहले stackoverflow पोस्ट है, तो हां, बल्कि सीमांत;) लग रहा है इस बारे में और

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