2009-03-13 13 views
194

Estoy tratando de analizar dos valores de una cuadrícula de datos.
Los campos son numéricos, y cuando tienen una coma (por ejemplo, 554,20), no puedo obtener los números después de la coma.
He intentado parseInt y parseFloat. ¿Cómo puedo hacer esto?Cómo convertir cadenas en float en JavaScript?

+0

** véase también: ** http://stackoverflow.com/questions/24318654 – dreftymac

Respuesta

285

Si están destinados a ser los valores separados, intente esto:

var values = "554,20".split(",") 
var v1 = parseFloat(values[0]) 
var v2 = parseFloat(values[1]) 

Si están destinados a ser un solo valor (como en francés, donde la mitad está escrito 0,5)

var value = parseFloat("554,20".replace(",", ".")); 
+6

¿Qué pasa si tiene una coma utilizada como mil separador? P. ej. 1234 escrito como 1,234 –

+6

Puedes quitar la coma y luego analizarla. (por ejemplo, reemplázalo con "") –

+6

no es muy seguro, como sconto = parseFloat ("5,, 5" .replace (",", ".")); devuelve 5 para creer que es un número válido, pero pierde la .5 o puede considerar que no es un número válido – max4ever

26

Reemplace la coma con un punto.

Esto sólo devolverá 554:

var value = parseFloat("554,20") 

Esto devolverá 554.20:

var value = parseFloat("554.20") 

Así que al final, sólo tiene que utilizar:

var fValue = parseFloat(document.getElementById("textfield").value.replace(",",".")) 

No se olvide que parseInt() solo se debe usar para analizar enteros (sin puntos flotantes). En su caso, solo devolverá 554. Además, al llamar a parseInt() en un flotante no se redondeará el número: ocupará su piso (entero inferior más cercano).

+0

Qué pasa con el "" ¿Separador de miles? Como 4.554,20, ¿qué devolvería ...? –

42

¿Alguna vez has intentado hacer esto? : p

var str = '3.8';ie 
alert(+(str) + 0.2); 

+ (cadena) fundirán la cuerda en el flotador.

¡Práctico!

lo que a fin de resolver su problema, usted puede hacer algo como esto:

var floatValue = +(str.replace(/,/,'.')); 
+6

Me gusta mucho la solución '+ (str)' - 'parseFloat' ignora los caracteres no válidos después del número,' + (str) 'devuelve' NaN' en esos casos, que es exactamente lo que necesito. – Alex

+0

Esta parece ser la mejor respuesta, similar a la fundición a un int cambiando el signo dos veces con ~, como en ~~ "45.2" = 45 –

13

Si extiende objeto String como esto ..

String.prototype.float = function() { 
    return parseFloat(this.replace(',', '.')); 
} 

.. se puede ejecutar como esto

"554,20".float() 
> 554.20 

obras con puntos, así

"554.20".float() 
> 554.20 

typeof "554,20".float() 
> "number" 
+7

Aunque por lo general se considera mala forma de modificar los prototipos de objetos de base. ¿Y si otro marco también intentara hacer eso pero la funcionalidad era diferente? – phreakhead

2

@GusDeCool o cualquier otra persona tratando de reemplazar más de un separadores de miles, una forma de hacerlo es reemplazar un mundial de expresiones regulares: /foo/g. Solo recuerde que . es un metacaracter, por lo que debe escaparse o ponerlo entre corchetes (\. o [.]). Aquí hay una opción:

var str = '6.000.000'; 
str.replace(/[.]/g,","); 
+1

sí, un reemplazo sin una expresión regular solo reemplaza una ocurrencia del carácter. – Aukhan

0

he tenido el mismo problema, excepto que no sabía de antemano lo que eran los separadores de miles y el separador decimal. Terminé escribiendo una biblioteca para hacer esto. Si está interesado aquí, es: https://github.com/GuillaumeLeclerc/number-parsing

3

Puede usar esta función.Reemplazará las comas con '' y luego analizará el valor de Flas y luego volverá a ajustar las comas en el valor.

function convertToFloat(val) { 
     if (val != '') { 
      if (val.indexOf(',') !== -1) 
       val.replace(',', ''); 
      val = parseFloat(val); 
      while (/(\d+)(\d{3})/.test(val.toString())) { 
       val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2'); 
      } 
     } 
     return val; 
    }