2010-01-18 19 views
41

एक सोचा मुझे मारा के रूप में मुझे लगता है कि कुछ चल बिन्दु मान संसाधित जावास्क्रिप्ट कोड का एक टुकड़ा लिख ​​रहा था। जावास्क्रिप्ट में दशमलव बिंदु प्रतीक क्या है? क्या यह हमेशा . है? या यह संस्कृति विशिष्ट है? और .toFixed() और .parseFloat() के बारे में क्या? यदि मैं उपयोगकर्ता इनपुट को संसाधित कर रहा हूं, तो इसमें स्थानीय संस्कृति-विशिष्ट दशमलव विभाजक प्रतीक शामिल होने की संभावना है।जावास्क्रिप्ट में दशमलव विभाजक प्रतीक क्या है?

आखिरकार मैं कोड लिखना चाहता हूं जो उपयोगकर्ता इनपुट - संस्कृति-विशिष्ट और . में दशमलव बिंदु दोनों का समर्थन करता है, लेकिन अगर मुझे नहीं पता कि जावास्क्रिप्ट क्या अपेक्षा करता है तो मैं ऐसा कोड नहीं लिख सकता।

जोड़ा गया:

function whatDecimalSeparator() { 
    var n = 1.1; 
    n = n.toLocaleString().substring(1, 2); 
    return n; 
} 

यह अच्छा है, यह मेरे लोकेल दशमलव बिंदु करने देता है: ठीक है, रूबेंस Farias suggestssimilar question जो एक साफ स्वीकार किए जाते हैं जवाब है को देखने के लिए। समाधान की ओर एक कदम, इसमें कोई संदेह नहीं है।

अब, शेष भाग यह निर्धारित करना होगा कि .parseFloat() का व्यवहार क्या है। कई उत्तरों बताते हैं कि फ्लोटिंग पॉइंट अक्षर के लिए केवल . मान्य है। .parseFloat() एक ही तरीके से कार्य करता है? या शायद कुछ ब्राउज़र में स्थानीय दशमलव विभाजक की आवश्यकता हो सकती है? क्या फ्लोटिंग पॉइंट नंबरों को पार्स करने के लिए भी कोई अलग तरीका है? क्या मुझे अपनी खुद की बस सुनिश्चित करनी चाहिए?

+0

@ विल्क्स- आप जो कर रहे हैं, उसके लिए मैं 'parseFloat() 'के बजाय यूनरी (+) ऑपरेटर का उपयोग करने पर विचार करूंगा। इनपुट मान्य करते समय यह बहुत आसान होगा। मेरा अद्यतन उत्तर देखें। –

उत्तर

19

के अनुसार के साथ साथ सही प्रारूप में स्ट्रिंग प्राप्त करने के लिए विनिर्देश, एक दशमलव दशमलव को परिभाषित किया गया है:

DecimalLiteral :: 
    DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt 
    . DecimalDigits ExponentPartopt 
    DecimalIntegerLiteral ExponentPartopt 

और parseFloat तर्क संतुष्ट करने के लिए:

  1. Let ToString (स्ट्रिंग) हो inputString।
  2. Let trimmedString वाम-पंथी चरित्र है कि एक StrWhiteSpaceChar और उस चरित्र के अधिकार के लिए सभी पात्रों नहीं है से मिलकर inputString की सबस्ट्रिंग हो। (दूसरे शब्दों में, सफेद स्थान प्रमुख को हटा दें।)
  3. तो न trimmedString न ही किसी भी उपसर्ग trimmedString का एक स्ट्रैडेसिमल लिटरल के सिंटैक्स को संतुष्ट करता है (9.3.1 देखें), NaN वापस करें।
  4. नंबरस्ट्रिंग को ट्रिम किए गए स्ट्रिंग का सबसे लंबा उपसर्ग होना चाहिए, जो ट्रिम किया जा सकता है खुद को स्ट्रिंग करना, जो स्ट्रडसिमल लिटरल के सिंटैक्स को संतुष्ट करता है।
  5. वापसी एमवी

के लिए संख्या मूल्य तो numberString trimmedString के सबसे लंबे उपसर्ग है कि एक StrDecimalLiteral की वाक्य रचना को संतुष्ट करता है, यह इनपुट में पाता है पहले parseable शाब्दिक स्ट्रिंग संख्या अर्थ हो जाता है। फ्लोटिंग-पॉइंट नंबर निर्दिष्ट करने के लिए केवल . का उपयोग किया जा सकता है।आप अलग अलग स्थानों से इनपुट स्वीकार कर रहे हैं, तो एक स्ट्रिंग की जगह का उपयोग करें:

function parseLocalNum(num) { 
    return +(num.replace(",", ".")); 
} 

समारोह parseFloat के बजाय एकल ऑपरेटर का उपयोग करता है, क्योंकि मुझे लगता है कि आप निवेश के बारे में सख्त होना चाहता हूँ। parseFloat("1ABC")1 होगा, जबकि यूनरी ऑपरेटर +"1ABC" का उपयोग NaN देता है। इससे इनपुट को प्रमाणित करना बहुत आसान हो जाता है। पार्सफ्लैट का उपयोग करना सिर्फ अनुमान लगा रहा है कि इनपुट सही प्रारूप में है।

+0

को यह नहीं देखा कि यह सचमुच है। क्या 'parseFloat() 'को ऐसा करने की आवश्यकता है? –

+3

हां। किसी भी लोकेल में 'parseFloat ("1,01") '1' वापस नहीं आएगा, न कि' 1.01' –

+4

मोज़िला डेवलपर सेंटर कहता है: "parseFloat इसके तर्क, एक स्ट्रिंग को पार करता है, और एक फ़्लोटिंग पॉइंट नंबर देता है। अगर यह किसी चरित्र से मुकाबला करता है एक संकेत (+ या -), अंक (0-9), एक दशमलव बिंदु, या एक एक्सपोनेंट के अलावा, यह उस बिंदु तक मान देता है और उस चरित्र और सभी सफल पात्रों को अनदेखा करता है। अग्रणी और पिछली जगहों की अनुमति है। " https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/parseFloat –

2

जहां तक ​​मुझे पता है, जावास्क्रिप्ट स्वयं केवल . विभाजक के बारे में जानता है। कम से कम एक व्यक्ति जिसका निर्णय मैं जे एस बातों से सहमत हैं पर भरोसा:

http://www.merlyn.demon.co.uk/js-maths.htm#DTS

+2

इसमें जोड़ने के लिए, व्याकरण wrt पार्सिंग संख्यात्मक अक्षरों पर पुरानी ECMAScript 262 विनिर्देश देखें: http://bclary.com/2004/11/07/#a-7.8.3 – Anonymous

+0

आह हाँ, हमेशा के लिए आधिकारिक दस्तावेज होना अच्छा है इस तरह की चीज, धन्यवाद :) –

+0

हाँ, यह अक्षर के लिए है। स्ट्रिंग इनपुट पार्सिंग के बारे में क्या? –

9

उपयोग:

theNumber.toLocaleString(); 

सही दशमलव और हजारों विभाजक

+0

ठीक है। और मैं इन विभाजकों के साथ एक स्ट्रिंग का विश्लेषण कैसे करूं? –

+0

आपको सीपीएस को तोड़ने की ज़रूरत होगी, और सुनिश्चित करें कि यह कुछ इस तरह से अनुरूप है: [\ + \ -]? ([0-9] + | [0-9] * (\। ([EE] [\ + \ -]? [0-9] +))?) – jspcal

+0

पर्याप्त मेला, मैं जो कुछ भी जरूरी है उसे पट्टी कर सकता हूं, और लोकेल-विशिष्ट विभाजक को '.' के साथ प्रतिस्थापित कर सकता हूं। लेकिन एकमात्र चीज है।'parseFloat() 'अपेक्षा करता है? –

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