2011-09-15 257 views
34

Un elemento de entrada contiene los números a en la que coma o un punto se utiliza como separador decimal y el espacio puede ser utilizado para miles de grupos como éste:Convert con punto o una coma como separador decimal a número en JavaScript

'1 , 2'
'110 000,23'
'100 1,23'

¿Cómo se podría convertirlos a un número flotante en el navegador usando JavaScript?

jQuery y jQuery UI se utilizan. Number(string) devuelve NaN y parseFloat() se detiene en el primer espacio o coma.

Respuesta

43

hacen un Sustituir el primer:

parseFloat(str.replace(',','.').replace(' ','')) 
+27

Esto ignora por completo el hecho de que ',' se usa a menudo como un separador de miles (agrupamiento). Si usas esto en un número como '1,000,000.00', obtienes' 1', lo que obviamente es completamente incorrecto. – Thor84no

+0

@ Thor84no Supongamos que su código se ejecutará en la cultura EN, pero si los datos serán ingresados ​​por personas que utilizan, por ejemplo, el idioma francés, danés, finlandés, checo, etc., no habrá confusión. Todo depende del uso del código – Zbynek

+9

@Zbynek. No estoy suponiendo eso en absoluto. La mayoría, si no todos, los idiomas/regiones usan la agrupación de dígitos de alguna descripción. El carácter utilizado varía (por ejemplo, '[., ']'). Estoy señalando el hecho de que este código está ignorando una gran cantidad de entradas que lo harán incorrecto sin advertencia en la respuesta (y no hay manera de saber que ha sucedido). Incluso si los idiomas que lista no tendrán este problema que no niega el hecho de que en * muchos * * muchos * idiomas tendrá ese problema. Tenga en cuenta que se dividirá igualmente si el idioma en cuestión utiliza '.' como su carácter de agrupación de dígitos. – Thor84no

8

podría reemplazar todos los espacios por una cadena vacía, todas las comas por puntos y luego analizarlo.

var str = "110 000,23"; 
var num = parseFloat(str.replace(/\s/g, "").replace(",", ".")); 
console.log(num); 

Utilicé un regex en el primero para poder hacer coincidir todos los espacios, no solo el primero.

14

La solución perfecta

accounting.js es una pequeña librería JavaScript para número, el dinero y el formato de moneda.

Check this for ref

+0

Gracias. Esto no proporciona una opción para verificar el formato incorrecto al hacer unformat, pero es una buena biblioteca base para construir esa funcionalidad. Ejemplo de resultado ambiguo: http://jsfiddle.net/SkzYe/ –

+0

Para referencia futura, esta biblioteca se ha movido a http://openexchangerates.github.io/accounting.js/ – Thor84no

7

Soy consciente de que estoy tarde a la fiesta, pero quería una solución para esto que maneja adecuadamente dígitos agrupación, así como diferentes separadores de decimales para las monedas. Como ninguno de ellos totalmente cubierto mi caso uso escribí mi propia solución que puede ser útil a los demás:

function parsePotentiallyGroupedFloat(stringValue) { 
    stringValue = stringValue.trim(); 
    var result = stringValue.replace(/[^0-9]/g, ''); 
    if (/[,\.]\d{2}$/.test(stringValue)) { 
     result = result.replace(/(\d{2})$/, '.$1'); 
    } 
    return parseFloat(result); 
} 

Esto debería tira a cualquier no-dígitos y luego comprobar si había un punto decimal (o una coma) seguido por dos dígitos e inserte el punto decimal si es necesario.

Vale la pena señalar que apunté esto específicamente a la moneda y, como tal, no asume ningún punto decimal o exactamente dos. Es bastante difícil estar seguro de si el primer punto decimal potencial encontrado es un punto decimal o un carácter de agrupación de dígitos (por ejemplo, 1.542 podría ser 1542) a menos que conozca los detalles de la configuración regional actual, pero debería ser lo suficientemente fácil de adaptar Para su caso de uso específico, cambie \d{2}$ a algo que corresponda adecuadamente con lo que espera después del punto decimal.

-1

A partir del número de secuencia moneda es fácil a través de Number.prototype.toLocaleString. Sin embargo, el reverso parece ser un problema común. El separador de miles y el punto decimal no se pueden obtener en el estándar JS.

En esta pregunta en particular, el separador de miles es un espacio en blanco " " pero en muchos casos puede ser un período "." y el punto decimal puede ser una coma ",".Tal como en 1 000 000,00 o 1.000.000,00. Entonces así es como lo convierto en un número de coma flotante apropiado.

var price = "1 000.000,99", 
 
    value = +price.replace(/(\.|\s)|(\,)/g,(m,p1,p2) => p1 ? "" : "."); 
 
console.log(value);

Así que la devolución de llamada sustituto de toma "1.000.000,00" y la convierte en "1000000.00". Después de eso + en el frente de la cadena resultante lo coacciona en un número.

Esta función es en realidad bastante práctico. Por ejemplo si se reemplaza la parte p1 = "" con p1 = "," en la función de devolución de llamada, una entrada de 1.000.000,00 resultaría 1,000,000.00

+0

Ambos '" 1 000 000,99 "' y '" 1 000 000.99 "' da como resultado 'NaN'. Su sintaxis también ofusca que 'p1 =' y 'p2 =' en realidad no hacen nada. Los valores asignados a ellos se devuelven porque es una función de flecha de instrucción única, pero la asignación es completamente innecesaria y hace que sea más difícil de leer. – Thor84no

+0

@ Thor84no Gracias por la información. – Redu

5

¿Qué hay de:

parseFloat(str.replace(' ', '').replace('.', '').replace(',', '.')); 
1

Todas las otras soluciones que requieren conocer el formato de antemano. Necesitaba detectar (!) El formato en todos los casos y esto es con lo que termino.

function detectFloat(source) { 
    let float = accounting.unformat(source); 
    let posComma = source.indexOf(','); 
    if (posComma > -1) { 
     let posDot = source.indexOf('.'); 
     if (posDot > -1 && posComma > posDot) { 
      let germanFloat = accounting.unformat(source, ','); 
      if (Math.abs(germanFloat) > Math.abs(float)) { 
       float = germanFloat; 
      } 
     } else { 
      // source = source.replace(/,/g, '.'); 
      float = accounting.unformat(source, ','); 
     } 
    } 
    return float; 
} 

Esto ha sido probado con los siguientes casos:

 const cases = { 
      "0": 0, 
      "10.12": 10.12, 
      "222.20": 222.20, 
      "-222.20": -222.20, 
      "+222,20": 222.20, 
      "-222,20": -222.20, 
      "-2.222,20": -2222.20, 
      "-11.111,20": -11111.20, 
     }; 

Se aceptan sugerencias.

Cuestiones relacionadas