2008-08-01 30 views
50

बहु-सांस्कृतिक प्रोग्रामिंग के मजेदार हिस्सों में से एक संख्या प्रारूप है।फ़्लोटिंग प्वाइंट नंबर पार्सिंग: क्या कोई एल्गोरिदम कैच है?

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

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

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

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

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

उत्तर

25

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

26

मुझे समस्या के एएसपी.NET पक्ष को नहीं पता लेकिन .NET की एक बहुत शक्तिशाली कक्षा है: System.Globalization.CultureInfo

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

ASP.NET किसी भी तरह (HTTP अनुरोध हेडर का उपयोग करके यानी) पास रहता है तो वर्तमान उपयोगकर्ता के CultureInfo के लिए या तो CultureInfo.CurrentCulture या CultureInfo.CurrentUICulture, इन होगा: आप एक स्ट्रिंग एक डबल मूल्य युक्त पार्स करने के लिए निम्नलिखित कोड का उपयोग कर सकते बढ़िया कार्य करना।

11

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

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture); 
9

फ्रेंच और अंग्रेजी में 12.345 के बीच का अंतर 1000 का एक कारक है। यदि आप अपेक्षित सीमा की आपूर्ति करते हैं जहां अधिकतम < 1000 * मिनट, तो आप आसानी से अनुमान लगा सकते हैं।

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

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

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