Javascript parse float ignora los decimales después de mi coma


81

He aquí un escenario sencillo. Quiero mostrar la resta de dos valores que se muestran en mi sitio:

//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

¿Alguien puede decirme qué estoy haciendo mal?

Respuestas:


159

Esto es "por diseño". La parseFloatfunción solo considerará las partes de la cadena hasta que llegue a un número que no sea +, -, exponente o punto decimal. Una vez que ve la coma, deja de mirar y solo considera la parte "75".

Para arreglar esto, convierta las comas en puntos decimales.

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

9
¿Funcionará esto en todas las regiones? ¿No está usando coma dependiendo de su configuración regional en el sistema operativo?
Dusan Plavak

14
El código anterior solo eliminará el primer ','. ¿Qué pasa si el número es 700,000,000? Necesita: .replace (/, / g, '')
hyankov

17
Creo que la mayoría de la gente está olvidando que la coma también se puede usar como separador de mil y no solo como separador decimal.
Peter Raeves

3
Hola, qué pasa si la entrada es lo 5.200,75que significa cinco mil doscientos punto setenta y cinco.
hasan05

Esta respuesta solo funcionará en el escenario actual, y si, por ejemplo, el número es 15,000, entonces mostrará 15, ¡lo cual es incorrecto!
itsHarshad

31

parseFloat de javascript no toma un parámetro de configuración regional. Entonces tendrás que reemplazar ,con.

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

19
¿Qué pasa si el número es 7,000,000.15?
Peter Raeves

7
Usted está a cargo de adaptar sus cadenas para que parezcan un flotador, al intentar analizarlas. Si su configuración regional usa puntos para los puntos decimales, entonces puede quitar todas las comas (separadores de miles) de manera segura antes de intentar analizarlo en un flotante. Si su configuración regional utiliza comas en lugar de puntos para los puntos decimales, puede eliminar con seguridad cualquier punto (separadores de miles) y luego cambiar la coma (punto decimal) a un punto.
Ultroman the Tacoman



12

Como señaló @JaredPar en su respuesta, use parseFloatcon reemplazar

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

Simplemente reemplazando el commacon un dotarreglo de voluntad, a menos que sea un número superior a los miles, de 1.000.000,00esta manera obtendrá el dígito incorrecto. Por lo tanto, debe reemplazar el commaarchivo dots.

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

Al usar dos reemplazos, podrá manejar los datos sin recibir dígitos incorrectos en la salida.


8

Es mejor usar esta sintaxis para reemplazar todas las comas en un caso de un millón 1,234,567

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

Los gmedios para eliminar todas las comas.

Consulte la demostración de Jsfiddle aquí .


7

Los números en JS usan un carácter .(punto / punto) para indicar el punto decimal, no una ,(coma).


1

Para cualquiera que llegue aquí y se pregunte cómo lidiar con este problema en el que las comas ( ,) y los puntos ( ) .pueden estar involucrados, pero es posible que no se conozca el formato de número exacto; así es como corrijo una cadena antes de usar parseFloat()(tomando prestadas ideas de otras respuestas):

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

Como mínimo, esto permitiría analizar los formatos decimales británicos / estadounidenses y europeos (asumiendo que la cadena contiene un número válido).


Funciona muy bien para ambos formatos 1,234.56y1.234,56
joseantgv

0

En mi caso, ya tenía un punto (.)y también una coma (,), así que lo que funcionó para mí fue replacela coma (,)con una cadena vacía como la siguiente:

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

Esto asumiendo que la cantidad de la base de datos existente es 3,000.78. Los resultados son: 3000.78sin la coma inicial (,).


-1

Desde mi país de origen, el formato de moneda es como "3.050,89 €"

parseFloat identifica el punto como separador decimal, para sumar 2 valores podríamos ponerlo así:

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.