2011-01-13 8 views
7

लघु प्रश्न:सी # decimal.Parse व्यवहार

क्यों कर रहे हैं इन '.....' .NET में एक दशमलव को पार्स (सी #) के लिए मान्य:

decimal res = decimal.Parse("8......15"); // returns 815 
decimal res = decimal.Parse("8...15");  // returns 815 
decimal res = decimal.Parse("8..15");  // returns 815 

के लिए कारण नहीं है क्या इस?

+0

मैं .NET4.0 में यह जाँच है। यह प्रारूप अपवाद – HuBeZa

+0

बढ़ाता है आप किस संस्कृति का उपयोग कर रहे हैं? उन तारों को मेरी वर्तमान संस्कृति या परिवर्तनीय संस्कृति का उपयोग करके पार्स नहीं किया जा सकता है। – LukeH

+0

मुझे लगता है कि यह एक प्रोग्रामर आलस्य है। मैंने ऐसी जगह नहीं देखी है जो हजारों विभाजक का उपयोग करता है जो कमजोर है। – HuBeZa

उत्तर

18

यह मेरे लिए विफल रहता है। क्या आप किसी संस्कृति में किसी भी मौके से हैं जहां "।" हजारों विभाजक है और "," दशमलव बिंदु है? Decimal.Parse (और इसी तरह की कॉल) डिफ़ॉल्ट रूप से थ्रेड की वर्तमान संस्कृति का उपयोग करें। कि एक अच्छी बात है या नहीं, यह बहस का मुद्दा है, लेकिन वास्तविक व्यवहार :) के लिए अप्रासंगिक है

decimal.Parse कॉल में CultureInfo.InvariantCulture निर्दिष्ट करने का प्रयास करें:

decimal res = decimal.Parse("8......15", CultureInfo.InvariantCulture); 

मुझे विश्वास है कि के रूप में आप की उम्मीद व्यवहार करेगा।

+0

मुझे लगता है कि आपने वहां सिर पर नाखून मारा है। उदाहरण के लिए, यदि आप 'de-DE' संस्कृति का उपयोग करते हैं, तो यह सही ढंग से विश्लेषण करता है। – LukeH

+0

'es-ES' से। वास्तव में क्या अजीब संस्कृति – HuBeZa

+0

वास्तव में। माई करंटकल्चर "एनएल-बीई" है, संख्या डेसीमलसेपरेटर = "," और संख्या समूह समूह = "।" धन्यवाद! लेकिन यह अजीब बात है कि वे इस तरह के संकेत की अनुमति देते हैं। – juFo

1

मुझे नहीं पता क्यों, लेकिन मुझे पता है कि यह कैसे काम करता है (दशमलव पार्सर कोड भाग नीचे देखें)। मुझे लगता है कि आखिरी और अगर बिंदु झंडा चालू करें और सभी बिंदुओं को छोड़ दें।

while (true) 
{ 
    if (((ch >= '0') && (ch <= '9')) || (((options & NumberStyles.AllowHexSpecifier) != NumberStyles.None) && (((ch >= 'a') && (ch <= 'f')) || ((ch >= 'A') && (ch <= 'F'))))) 
    { 
     //Here goes some code... 
    } 
    else if ((((options & NumberStyles.AllowDecimalPoint) != NumberStyles.None) && ((num & 0x10) == 0)) 
    && (((chPtr2 = MatchChars(p, currencyDecimalSeparator)) != null) || ((flag && ((num & 0x20) == 0)) 
    && ((chPtr2 = MatchChars(p, numberDecimalSeparator)) != null)))) 
    { 
     num |= 0x10; 
     p = chPtr2 - 1; 
    } 
} 

सभी कोड की जांच करने के लिए परावर्तक उपकरण का उपयोग करें।

+0

दिलचस्प! HexSpecifier के बारे में उस भाग कोड को देखना अच्छा लगा। – juFo

2

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

हम उन्हें हजारों विभाजक कहते हैं, लेकिन वे वास्तव में नहीं हैं। वे समूह विभाजक हैं - आप प्रत्येक 3 अंक, प्रत्येक 10 अंक, प्रत्येक 1 अंक विभाजित कर सकते हैं, तो प्रत्येक 0 अंक क्यों नहीं?

दिलचस्प है, कोड .NET 4 के लिए बदल गया है - यह मेरे लिए परावर्तक से प्रासंगिक उत्पादन होता है:

else 
{ 
    if (((currencySymbol == null) || 
     ((chPtr2 = MatchChars(p, currencySymbol)) == null)) && 
     ((ansiCurrencySymbol == null) || 
     ((chPtr2 = MatchChars(p, ansiCurrencySymbol)) == null))) 
    { 
     break; 
    } 
    num |= 0x20; 
    currencySymbol = null; 
    ansiCurrencySymbol = null; 
    p = chPtr2 - 1; 
} 
संबंधित मुद्दे