ios - NSDecimalNumber decimalNumberWithString: ignores current locale -


प्रलेखन के अनुसार, [NSDecimalNumber दशमलव संख्याविथस्ट्रिंग:] को लोकेल दशमलव विभाजक का उपयोग करना चाहिए:

क्या NSDecimalSeparator अवधि (जैसा कि संयुक्त राज्य अमेरिका में है, उदाहरण के लिए उपयोग किया जाता है) या अल्पविराम (जैसा कि प्रयोग किया जाता है, उदाहरण के लिए, फ़्रांस में) डिफ़ॉल्ट लोकेल पर निर्भर करता है।

लेकिन जब मैं इसे करने की कोशिश करता हूं, तो यह कोड:

  NSLog (@ "% @", [NSDecimalNumber दशमलवसमूहविथः स्ट्रिंग: @ "100.1"]); एनएसएलॉग (@ "% @", [एनएसडीसीमलनम्बर दशमलवसमूहविथः स्ट्रिंग: @ "100,1" लोकेल: एनएसएलोकैले। कंटेंट लोकल]);   

देता है

  100 100.1   

... आईओएस 5 और आईओएस 6 दोनों पर आउटपुट के रूप में मैंने स्वीडिश और फ्रेंच के साथ क्षेत्रीय सेटिंग्स के रूप में कोशिश की है क्योंकि इन दोनों देशों ने दशमलव विभाजक के रूप में अल्पविराम (,) का उपयोग किया है।

क्या आउटपुट समान नहीं होना चाहिए?

(मुझे पता है कि मैं व्यवहार करने के लिए [NSDecimalNumber दशमलव दशमलव संख्याविथस्ट्रेर्ड: लोकेल] का उपयोग कर सकता हूं, इसलिए यह प्रश्न वैकल्पिक खोजने के बारे में नहीं है, बस यह बग है या मैं कुछ गलत कर रहा हूं)

NSDecimalNumber केवल संख्या-प्रकार डेटा के लिए एक भंडारण वर्ग है यह एक पार्सर (NSNumberFormatter) चल रहा है, जिस पर आप इसे पास करते हैं, उसका नंबर बनाते हैं। इसका कारण है कि आपका दूसरा लॉग स्टेटमेंट "बेहतर" काम करता है क्योंकि पहले वाला एक डिफ़ॉल्ट संख्या प्रारूप लोकेल का उपयोग कर रहा है (यह जैसा दिखता है यह en_US है, लेकिन मैं इसे सत्यापित नहीं कर सकता, संपादित करें अधिक जानकारी के लिए झटका ।), और "100,1" एक मान्य संख्या नहीं है, इसलिए "गैर-संख्या" भाग को छीन लिया जाता है। "," दशमलव विभाजक को पूर्ण स्थान पर कैप्चर करने वाले किसी लोकेल को निर्दिष्ट करके।

जब आप NSLog () एक NSDecimalNumber करते हैं तो यह बस -description को कॉल कर रहा है, जिसमें कोई लोकेल संदर्भ नहीं है

  NSDecimalNumber * number = [NSDecimalNumber दशमलव संख्याविथः स्ट्रिंग:  

@ "100.1"]; एनएसएलॉग (@ "% @", नंबर); NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; [सेटर सेटनम्बर स्टाइल: NSNumberFormatterDecimalStyle]; NSLocale * locale = [[NSLocale alloc] initWithLocaleIdentifier: @ "fr_FR"]; [सेटर सेटलोकेल: लोकेल]; एनएसएलॉग (@ "% @", [फॉर्मर स्ट्रिंगफ़ॉर्मनम्बर: नंबर]);

या, संक्षेप में

  NSDecimalNumber * number = [NSDecimalNumber दशमलवसमूहविथस्ट्रिंग: @ "100.1"]; NSLog (@ "% @", [NSNumberFormatter स्थानीयकृत स्ट्रिंगफ़ॉर्मनम्बर: संख्या संख्या शैली: NSNumberFormatterDecimalStyle]);   

यदि आप वर्तमान लोकेल का उपयोग करना चाहते हैं।

सारांश में:

  1. NSDecimalNumber सिर्फ भंडारण है यह लॉगिंग लोकेल के बारे में कुछ भी नहीं दिखाती है।
  2. एक नंबर को ठीक से संचित करने के लिए एनएसडीसीकमलन नंबर प्राप्त करने के लिए, इसके लोकेल को अपेक्षित इनपुट ( - [NSLocale currentLocale]) के लोकेल से मेल खाना चाहिए। > यहाँ एक अच्छी पसंद है।)
  3. दिए गए लोकेल के लिए सही रूप में स्वरूपित संख्या प्रदर्शित करने के लिए, NSNumberFormatter का उपयोग करें।

    संपादित करें: / Strong>

    ठीक है, मैंने इस पर कुछ और शोध किया है।

    GNUStep में ऐसा लगता है कि यह NSDecimalSeparator के लिए मान का उपयोग करके समाप्त होता है NSUserDefaults (उनके कोड की त्वरित ब्राउज़िंग से)।

    कुछ प्रयोग करने से मैंने पाया है कि निम्न में से कोई भी डिफ़ॉल्ट पार्सिंग व्यवहार को प्रभावित नहीं करता है, जहां तक ​​मैं बता सकता हूं:

    1. NSDecimalSeparator में NSUserDefaults
    2. AppleLocale में NSUserDefaults
    3. NSLocaleCode में NSUserDefaults
    4. CFBundleDevelopmentRegion के लिए मान सेट < / कोड>।
    5. पर्यावरण का LANG / LC_ALL / etc ... मान।
    6. + [NSLocale सिस्टम लॉकल]

      और जाहिर है यह + [NSLocale currentLocale] नहीं है, क्योंकि यह प्रश्न इस तथ्य से उत्पन्न होता है कि वर्तमान लोकेल का कोई प्रभाव नहीं है ।

Comments

Popular posts from this blog

excel vba - How to delete Solver(SOLVER.XLAM) code -

github - Teamcity & Git - PR merge builds - anyway to get HEAD commit hash? -

ios - Replace text in UITextView run slowly -