2016-01-27 9 views
7

पर डाली गई है, संस्कृति की जानकारी का उपयोग करते समय, संख्या को दो बार परिवर्तित करते समय मुझे अजीब व्यवहार का सामना करना पड़ रहा है।
डच संस्कृति का उपयोग करते हुए "3,3" को परिवर्तित करते समय, सही ढंग से संभाला जाता है। यदि मैं अमेरिकी संस्कृति का उपयोग कर "3,3" रूपांतरित करता हूं, तो यह 33 देता है। मैं एक त्रुटि की उम्मीद कर रहा था। मेरा उदाहरण देखें:दशमलव विभाजक के साथ संख्या गलत रूप से डबल

static void Main(string[] args) 
{ 
    CultureInfo cultureDutch = new CultureInfo("nl-NL"); 
    CultureInfo cultureUS = new CultureInfo("en-US"); 

    System.Threading.Thread.CurrentThread.CurrentCulture = cultureDutch; 
    Console.WriteLine("Input 3,3 --> Expected 3,3"); 
    Console.WriteLine("Output = " + Convert.ToDouble("3,3", cultureDutch)); 
    // Actual result --> 3,3 

    Console.WriteLine("Input 3,3 --> Expected InvalidCastException"); 
    Console.WriteLine("Output = " + Convert.ToDouble("3,3", cultureUS)); 
    // Actual result --> 33 

    Console.WriteLine(); 
    Console.WriteLine(); 

    System.Threading.Thread.CurrentThread.CurrentCulture = cultureUS; 
    Console.WriteLine("Input 3.3 --> Expected InvalidCastException"); 
    Console.WriteLine("Output = " + Convert.ToDouble("3.3", cultureDutch)); 
    // Actual result --> 33 

    Console.WriteLine("Input 3.3 --> Expected 3.3"); 
    Console.WriteLine("Output = " + Convert.ToDouble("3.3", cultureUS)); 
    // Actual result --> 3.3 
    Console.ReadLine(); 
} 

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

+0

अल्पविराम हजारों विभाजक है, .NET यह नहीं है कि उपयोगकर्ता कहां रखता है। या कि एक उपयोगकर्ता के पास अनियमित पैटर्न होता है, जैसे भारतीय करते हैं। आपको वास्तविक फिक्स को आगे बढ़ाने की आवश्यकता है और पता है कि उपयोगकर्ता किस प्रकार की भाषा बोलता है। यह कभी भी वास्तविक समस्या नहीं है, यह थ्रेड है। कंटेंटकल्चर। जब आप डच बोलते हैं तो आपको केवल यह समस्या होती है और इसके बारे में आपके ओएस को बताने के बिना हॉलैंड से नहीं होने का नाटक करता है। –

उत्तर

0

बोस एनकलर के उत्तर के साथ, मैं समस्या को हल करने में सक्षम हूं। तो सबसे पहले मैं मौजूदा संस्कृति के आधार पर हजारों विभाजक के लिए इनपुट स्कैन करूंगा। और अंत में मैं इनपुट मान को दो बार पार्स कर दूंगा।

private static string RemoveThousandSeparator(string input) 
    { 
     Regex removeThousandSeparatorExpr = new Regex(@"^-?(?:\d+|\d{1,3}(?:\" 
         + <CultureInfo>.NumberGroupSeparator + @"\d{3})+)(?:\" 
         + <CultureInfo>.NumberDecimalSeparator + @"\d+)?$"); 
     Match match = removeThousandSeparatorExpr.Match(input); 
     if (match.Success) 
     { 
      input = input.Replace(<CultureInfo>.NumberGroupSeparator, ""); 
     } 
     else 
     { 
      throw new Exception("Invalid input value"); 
     } 

     return input; 
    } 
2

तुम सिर्फ यह पार्स करने के लिए मैं समर्पित पार्स तरीकों जिसमें आप Numberstyles

सेट कर सकते हैं का प्रयोग करेंगे निम्नलिखित कोड एक FormatException फेंक चाहते हैं

var culture =new CultureInfo("en-US"); 
var result = double.Parse("3,3", NumberStyles.AllowDecimalPoint, culture); 

अधिक जानकारी के लिए देख Double.Parse Method

+0

मैंने सोचा कि यह जवाब था, लेकिन दुर्भाग्य से यह नहीं है। चूंकि इनपुट में हजारों विभाजकों को अस्वीकार करने वाले दशमलव और हजार विभाजक दोनों का जवाब नहीं हो सकता है। यूएस संस्कृति में 1,000.0 सही है, लेकिन AllowDecimalPoint का उपयोग करके, इसे अमान्य माना जाता है। मुझे लगता है कि गणनाओं में मूल्यों का उपयोग करने से पहले हजारों विभाजक को पट्टी करने के लिए मुझे एक रेगेक्स चाहिए। –

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