फ़्लोटिंग प्वाइंट नंबर पार्सिंग: क्या कोई एल्गोरिदम पकड़ता है?

बहु-सांस्कृतिक प्रोग्रामिंग के मजेदार हिस्सों में से एक संख्या प्रारूप है।

  • अमेरिकियों 10,000.50
  • का उपयोग करते हैं
  • जर्मन 10.000,50
  • का उपयोग करते हैं
  • फ्रेंच 10 000,50
  • का उपयोग करें

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

एक अन्य दृष्टिकोण: यदि स्ट्रिंग में 2 अलग-अलग गैर-संख्यात्मक वर्ण होते हैं, तो अंतिम को दशमलव विभाजक के रूप में उपयोग करें और दूसरों को त्याग दें। अगर मेरे पास केवल एक है, तो जांच करें कि यह एक से अधिक बार होता है और अगर ऐसा होता है तो इसे छोड़ दें। यदि यह केवल एक बार दिखाई देता है, तो जांच करें कि इसके बाद उसके 3 अंक हैं या नहीं। यदि हां, तो इसे छोड़ दें, अन्यथा इसे दशमलव विभाजक के रूप में उपयोग करें।

स्पष्ट "सर्वोत्तम समाधान" उपयोगकर्ता की संस्कृति या ब्राउज़र का पता लगाने के लिए होगा, लेकिन यदि आपके पास एक अमेरिकी-यूएस विंडोज / ब्राउज़र का उपयोग कर फ्रांसीसी है तो यह काम नहीं करता है।

क्या .NET Framework में कुछ पौराणिक काला जादू फ़्लोटिंग पॉइंट पार्सर है जो संख्या कोड को स्वत: पहचानने की कोशिश में Double। (Try) Parse() से बेहतर है?

0
जोड़ा संपादित
विचारों: 1

4 उत्तर

मुझे समस्या का एएसपी.NET पक्ष नहीं पता है लेकिन .NET की एक बहुत शक्तिशाली कक्षा है: System.Globalization.CultureInfo । आप डबल कोड वाले स्ट्रिंग को पार्स करने के लिए निम्न कोड का उपयोग कर सकते हैं:

double d = double.Parse("100.20", CultureInfo.CurrentCulture);
//  -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);

अगर एएसपी.नेट किसी भी तरह (यानी HTTP अनुरोध शीर्षलेखों का उपयोग कर) वर्तमान उपयोगकर्ता के संस्कृतिइन्फो को या तो CultureInfo.CurrentCulture या CultureInfo.CurrentUICulture को पास करता है, तो यह ठीक काम करेगा।

0
जोड़ा

आप सभी को खुश नहीं कर सकते हैं। अगर मैं 10.000 के रूप में दस दर्ज करता हूं, और कोई दस हजार के रूप में 10000 में प्रवेश करता है, तो आप इनपुट की संस्कृति के कुछ ज्ञान के बिना इसे संभाल नहीं सकते हैं। किसी भी तरह से संस्कृति का पता लगाएं (ब्राउज़र, सिस्टम सेटिंग - उपयोग केस क्या है? एएसपी? आंतरिक ऐप, या दुनिया के लिए खुला?), या अपेक्षित स्वरूपण का एक उदाहरण प्रदान करें, और सबसे अधिक लाभकारी पार्सर का उपयोग करें जो आप कर सकते हैं। शायद कुछ ऐसा है:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
0
जोड़ा

The difference between 12.345 in French and English is a factor of 1000. If you supply an expected range where max < 1000*min, you can easily guess.

उदाहरण के लिए मिमी में एक व्यक्ति (बच्चों और बच्चों सहित) की ऊंचाई लें।

200-3000 की एक श्रृंखला का उपयोग करके, 1.800 या 1,800 का इनपुट असंबद्ध रूप से 1 मीटर और 80 सेंटीमीटर के रूप में व्याख्या किया जा सकता है, जबकि 912.300 या 9 12,300 के इनपुट को अनजाने में 91 सेंटीमीटर और 2.3 मिलीमीटर के रूप में व्याख्या किया जा सकता है।

0
जोड़ा

मुझे लगता है कि आप इस मामले में सबसे अच्छा कर सकते हैं कि वे अपना इनपुट लें और फिर उन्हें दिखाएं कि उनका क्या मतलब है। यदि वे असहमत हैं, तो उन्हें प्रारूप दिखाएं जिन्हें आप उम्मीद कर रहे हैं और उन्हें फिर से दर्ज करने के लिए प्राप्त करें।

0
जोड़ा