Comment puis-je parsingr une chaîne avec un séparateur de virgule en un nombre?

I have 2,299.00 as a ssortingng and I am trying to parse it to a number. I sortinged using parseFloat , which results in 2. I guess the comma is the problem, but how would I solve this issue the right way? Just remove the comma?

 var x = parseFloat("2,299.00") alert(x); 

Yes remove the commas:

 parseFloat(yournumber.replace(/,/g, '')); 

Removing commas is potentially dangerous because, as others have mentioned in the comments, many locales use a comma to mean something different (like a decimal place).

I don’t know where you got your ssortingng from, but in some places in the world "2,299.00" = 2.299

The Intl object could have been a nice way to tackle this problem, but somehow they managed to ship the spec with only a Intl.NumberFormat.format() API and no parse counterpart 🙁

The only way to parse a ssortingng with cultural numeric characters in it to a machine recognisable number in any i18n sane way is to use a library that leverages CLDR data to cover off all possible ways of formatting number ssortingngs http://cldr.unicode.org/

The two best JS options I’ve come across for this so far:

Remove anything that isn’t a digit, decimal point, or minus sign ( - ):

 var str = "2,299.00"; str = str.replace(/[^\d\.\-]/g, ""); // You might also include + if you want them to be able to type it var num = parseFloat(str); 

Violon mis à jour

Note that it won’t work for numbers in scientific notation. If you want it to, change the replace line to add e , E , and + to the list of acceptable characters:

 str = str.replace(/[^\d\.\-eE+]/g, ""); 

On modern browsers you can use the built in Intl.NumberFormat to detect the browser’s number formatting and normalize the input to match.

 function parseNumber(value, locale = navigator.language) { const example = Intl.NumberFormat(locale).format('1.1'); const cleanPattern = new RegExp(`[^-+0-9${ example.charAt( 1 ) }]`, 'g'); const cleaned = value.replace(cleanPattern, ''); const normalized = cleaned.replace(example.charAt(1), '.'); return parseFloat(normalized); } const corpus = { '1.123': { expected: 1.123, locale: 'en-US' }, '1,123': { expected: 1123, locale: 'en-US' }, '2.123': { expected: 2123, locale: 'fr-FR' }, '2,123': { expected: 2.123, locale: 'fr-FR' }, } for (const candidate in corpus) { const { locale, expected } = corpus[candidate]; const parsed = parseNumber(candidate, locale); console.log(`${ candidate } in ${ corpus[ candidate ].locale } == ${ expected }? ${ parsed === expected }`); } 

Usually you should consider to use input fields which don’t allow free text input for numeric values. But there might be cases, when you need to guess the input format. For example 1.234,56 in Germany means 1,234.56 in US. See https://salesforce.stackexchange.com/a/21404 for a list of counsortinges which use comma as decimal.

I use the following function to do a best guess and ssortingp off all non-numeric characters:

 function parseNumber(strg) { var strg = strg || ""; var decimal = '.'; strg = strg.replace(/[^0-9$.,]/g, ''); if(strg.indexOf(',') > strg.indexOf('.')) decimal = ','; if((strg.match(new RegExp("\\" + decimal,"g")) || []).length > 1) decimal=""; if (decimal != "" && (strg.length - strg.indexOf(decimal) - 1 == 3) && strg.indexOf("0" + decimal)!==0) decimal = ""; strg = strg.replace(new RegExp("[^0-9$" + decimal + "]","g"), ""); strg = strg.replace(',', '.'); return parseFloat(strg); } 

Try it here: https://plnkr.co/edit/9p5Y6H?p=preview

Exemples:

 1.234,56 € => 1234.56 1,234.56USD => 1234.56 1,234,567€ => 1234567 1.234.567 => 1234567 1,234.567 => 1234.567 1.234 => 1234 // might be wrong - best guess 1,234 => 1234 // might be wrong - best guess 1.2345 => 1.2345 0,123 => 0.123 

The function has one weak point: It is not possible to guess the format if you have 1,123 or 1.123 – because depending on the locale format both might be a comma or a thousands-separator. In this special case the function will treat separator as a thousands-separator and return 1123.

All of these answers fail if you have a number in the millions.

3,456,789 would simply return 3456 with the replace method.

The most correct answer for simply removing the commas would have to be.

 var number = '3,456,789.12'; number.split(',').join(''); /* number now equips 3456789.12 */ parseFloat(number); 

Or simply written.

 number = parseFloat(number.split(',').join('')); 

If you want a l10n answer do it this way. Example uses currency, but you don’t need that. Intl library will need to be polyfilled if you have to support older browsers.

 var value = "2,299.00"; var currencyId = "USD"; var nf = new Intl.NumberFormat(undefined, {style:'currency', currency: currencyId, minimumFractionDigits: 2}); value = nf.format(value.replace(/,/g, "")); 

Replace the comma with an empty ssortingng:

 var x = parseFloat("2,299.00".replace(",","")) alert(x); 

If you have a small set of locales to support you’d probably be better off by just hardcoding a couple of simple rules:

 function parseNumber(str, locale) { let radix = ','; if (locale.match(/(en|th)([-_].+)?/)) { radix = '.'; } return Number(str .replace(new RegExp('[^\\d\\' + radix + ']', 'g'), '') .replace(radix, '.')); } 

It’s baffling that they included a toLocaleSsortingng but not a parse method. At least, toLocaleSsortingng without arguments is well supported in IE6+.

For a i18n solution, I came up with this:

First detect the user’s locale decimal separator:

 var decimalSeparator = 1.1; decimalSeparator = decimalSeparator.toLocaleSsortingng().subssortingng(1, 2); 

Then normalize the number, if there’s more than one decimal separator in the Ssortingng:

 var pattern = "([" + decimalSeparator + "])(?=.*\\1)";separator var formatted = valor.replace(new RegExp(pattern, "g"), ""); 

Finally remove anything that is not a number or a decimal separator:

 formatted = formatted.replace(new RegExp("[^0-9" + decimalSeparator + "]", "g"), ''); return Number(formatted.replace(decimalSeparator, "."));