जावास्क्रिप्ट पार्स फ्लोट मेरे कॉमा के बाद दशमलव को अनदेखा कर रहा है


81

यहाँ एक सरल परिदृश्य है। मैं अपनी साइट पर दो मूल्यों के घटाव को दिखाना चाहता हूं:

//Value on my websites HTML is: "75,00"
var fullcost = parseFloat($("#fullcost").text()); 

//Value on my websites HTML is: "0,03"
var auctioncost = parseFloat($("#auctioncost").text());

alert(fullcost); //Outputs: 75
alert(auctioncost); //Ouputs: 0

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं?

जवाबों:


159

यह "बाय डिजाइन" है। parseFloat, संख्या, प्रतिपादक या दशमलव बिंदु - समारोह केवल जब तक भाग में एक गैर +, स्ट्रिंग ऊपर के कुछ हिस्सों पर विचार करेगी। एक बार जब यह अल्पविराम देखता है तो यह देखना बंद कर देता है और केवल "75" भाग पर विचार करता है।

इसे ठीक करने के लिए कॉमा को दशमलव बिंदुओं में बदलें।

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

9
क्या यह सभी क्षेत्रों में काम करेगा? OS में आपकी क्षेत्रीय सेटिंग के आधार पर अल्पविराम का उपयोग नहीं कर रहा है?
दसन प्लावक

14
उपरोक्त कोड केवल पहले ',' को हटा देगा। क्या होगा यदि संख्या 700,000,000 है? आपको आवश्यकता है: .replace (/, / g, '')
hyankov

17
मुझे लगता है कि ज्यादातर लोग यह भूल रहे हैं कि कॉमा को एक हजार विभाजक के रूप में इस्तेमाल किया जा सकता है, न कि एक दशमलव विभाजक के रूप में।
पीटर रेव्स

3
हैलो, अगर इनपुट का 5.200,75मतलब पांच हजार दो सौ और बिंदु पचहत्तर है।
हसन ०५

यह उत्तर केवल वर्तमान परिदृश्य में काम करेगा, और यदि उदाहरण के लिए, संख्या 15,000 है तो वह 15 दिखाएगा, जो गलत है!
इसका हर्षद

31

जावास्क्रिप्ट का पार्सफ्लोअट लोकल पैरामीटर नहीं लेता है। तो आपको ,साथ देना पड़ेगा.

parseFloat('0,04'.replace(/,/, '.')); // 0.04

19
यदि संख्या 7,000,000.15 है तो क्या होगा?
पीटर रेव्स

7
जब आप उन्हें पार्स करने की कोशिश कर रहे हैं, तो आप अपने स्ट्रिंग्स को एक फ्लोट की तरह देखने के लिए प्रभारी हैं। यदि आपका स्थान दशमलव बिंदुओं के लिए अवधियों का उपयोग करता है, तो आप इसे फ्लोट पर पार्स करने की कोशिश करने से पहले सभी कॉमा (हजारों विभाजक) को सुरक्षित रूप से पट्टी कर सकते हैं। यदि आपका स्थान दशमलव बिंदुओं के लिए अवधियों के बजाय अल्पविराम का उपयोग करता है, तो आप किसी भी अवधि (हजारों विभाजक) को सुरक्षित रूप से निकाल सकते हैं और फिर अल्पविराम (दशमलव बिंदु) को एक अवधि में बदल सकते हैं।
अल्ट्रोमन द टेकमैन

20

वैश्वीकरण का उपयोग क्यों नहीं? यह केवल उन मुद्दों में से एक है जिसे आप अंग्रेजी भाषा का उपयोग नहीं करने पर चला सकते हैं:

Globalize.parseFloat('0,04'); // 0.04

Stackoverflow पर कुछ लिंक में देखने के लिए:


18

parseFloatएक दशमलव शाब्दिक की जावास्क्रिप्ट परिभाषा के अनुसार , आपके स्थान की परिभाषा नहीं। (जैसे, parseFloatलोकेल-अवेयर नहीं है।) दशमलव में दशमलव शाब्दिक .दशमलव बिंदु के लिए उपयोग करते हैं।


12

जैसा कि @JaredPar ने अपने उत्तर उपयोग parseFloatमें जगह के साथ बताया

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

बस commaएक dotवसीयत के स्थान पर, जब तक कि यह हजारों की संख्या में न हो, 1.000.000,00इस तरह से आपको गलत अंक मिलेगा। तो आपको commaहटाने को बदलने की आवश्यकता है dots

// Remove all dot's. Replace the comma.
var fullcost = parseFloat($("#fullcost").text().replace(/\./g,'').replace(',', '.'));

दो जगह का उपयोग करके आप आउटपुट में गलत अंक प्राप्त किए बिना डेटा से निपटने में सक्षम होंगे।


8

एक लाख 1,234,567 के मामले में सभी कॉमा को बदलने के लिए इस सिंटैक्स का उपयोग करना बेहतर है

var string = "1,234,567";
string = string.replace(/[^\d\.\-]/g, ""); 
var number = parseFloat(string);
console.log(number)

gसभी अल्पविराम को हटाने का साधन।

चेक डेमो यहाँ Jsfiddle


7

जेएस में संख्या .दशमलव बिंदु नहीं ,(अल्पविराम) को इंगित करने के लिए एक (पूर्ण विराम / अवधि) वर्ण का उपयोग करती है ।


1

यहां पहुंचने वाले किसी भी व्यक्ति के लिए इस समस्या से निपटने के तरीके के बारे में सोचें जहां अल्पविराम ( ,और पूर्ण विराम .) शामिल हो सकते हैं, लेकिन सटीक संख्या प्रारूप ज्ञात नहीं हो सकता है - यह इस तरह है कि मैं उपयोग parseFloat()करने से पहले एक स्ट्रिंग को सही करता हूं (अन्य उत्तरों से विचारों को उधार लेना):

function preformatFloat(float){
   if(!float){
      return '';
   };

   //Index of first comma
   const posC = float.indexOf(',');

   if(posC === -1){
      //No commas found, treat as float
      return float;
   };

   //Index of first full stop
   const posFS = float.indexOf('.');

   if(posFS === -1){
      //Uses commas and not full stops - swap them (e.g. 1,23 --> 1.23)
      return float.replace(/\,/g, '.');
   };

   //Uses both commas and full stops - ensure correct order and remove 1000s separators
   return ((posC < posFS) ? (float.replace(/\,/g,'')) : (float.replace(/\./g,'').replace(',', '.')));
};
// <-- parseFloat(preformatFloat('5.200,75'))
// --> 5200.75

बहुत कम से कम, यह ब्रिटिश / अमेरिकी और यूरोपीय दशमलव स्वरूपों की पार्सिंग की अनुमति देगा (यह मानते हुए कि स्ट्रिंग में एक वैध संख्या है)।


यह दोनों प्रारूपों के लिए बहुत अच्छा काम करता है 1,234.56और1.234,56
joseantgv

0

मेरे मामले में, मेरे पास पहले से ही एक अवधि थी (.)और एक अल्पविराम भी था (,), इसलिए मेरे लिए क्या काम किया गया था replaceजैसे अल्पावधि के (,)साथ अल्पविराम :

parseFloat('3,000.78'.replace(',', '')) 

यह मानकर चल रहा है कि मौजूदा डेटाबेस से राशि 3,000.78 है। परिणाम हैं: 3000.78प्रारंभिक अल्पविराम के बिना (,)


-1

मेरे मूल देश से मुद्रा प्रारूप "3.050,89 €" जैसा है

parseFloat डॉट को दशमलव विभाजक के रूप में पहचानता है, 2 मान जोड़ने के लिए हम इसे इस तरह डाल सकते हैं:

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.