¿Cómo convertir una cadena en flotante en JavaScript?

255

Estoy tratando de analizar dos valores de una cuadrícula de datos. Los campos son numéricos, y cuando tienen una coma (ej. 554,20), no puedo obtener los números después de la coma. Lo he intentado parseInty parseFloat. ¿Cómo puedo hacer esto?

Kamil Kiełczewski
fuente
ver también: stackoverflow.com/questions/24318654
dreftymac

Respuestas:

371

Si están destinados a ser 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 valor único (como en francés, donde la mitad se escribe 0,5)

var value = parseFloat("554,20".replace(",", "."));
Jesse Rusak
fuente
66
¿Qué pasa con el uso de una coma como un separador de miles? Ej. 1234 escrito como 1,234
Chris B
66
Podrías simplemente quitar la coma y luego analizarla. (p. ej. reemplazarlo con "")
Jesse Rusak
77
no es muy seguro, ya que sconto = parseFloat ("5,, 5" .replace (",", ".")); devuelve 5, lo que lleva a uno a creer que es un número válido, pero pierde la parte .5 o podría considerar que no es un número válido
max4ever
1
@ max4ever Si le preocupa aceptar silenciosamente números no válidos, puede usarlos en +(string)lugar de lo parseString(string)que sugiere @Stev a continuación. Entonces, el primer ejemplo sería v1 = +(values[0]); v2 = +(values[1]);.
Jesse Rusak
1
FALLO, ¿y si mi número es 6.000.000? La función reemplazar solo reemplaza el primer separador de coma
GusDeCooL
55

¿Alguna vez has tratado de hacer esto? :pags

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

+ (cadena) convertirá la cadena en flotante.

¡Práctico!

Entonces, para resolver su problema, puede hacer algo como esto:

var floatValue = +(str.replace(/,/,'.'));
Stev
fuente
77
Realmente me gusta la +(str)solución: parseFloatignora los caracteres no válidos después del número, +(str)devuelve NaNen esos casos, que es exactamente lo que necesito.
Alex
34

Reemplace la coma con un punto.

Esto solo devolverá 554:

var value = parseFloat("554,20")

Esto devolverá 554.20:

var value = parseFloat("554.20")

Entonces, al final, simplemente puede usar:

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

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


Ejemplo extendido para responder la pregunta de Pedro Ferreira de los comentarios:

Si el campo de texto contiene miles de puntos de separación, como en 1.234.567,99esos podrían eliminarse de antemano con otro replace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))
Wadih M.
fuente
Qué pasa con la "." ¿Separador de miles? Como 4.554,20, ¿qué devolvería ...?
Pedro Ferreira
16

Si extiende un objeto String como este ...

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

.. puedes ejecutarlo así

"554,20".float()
> 554.20

funciona con punto también

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"
sobi3ch
fuente
10
Aunque generalmente se considera mala forma de modificar los prototipos del objeto base. ¿Qué pasaría si otro marco también intentara hacer eso pero la funcionalidad fuera diferente?
phreakhead
3

@GusDeCool o cualquier otra persona tratando de reemplazar más de un separadores de miles, una forma de hacerlo es una expresión regular reemplazo global: /foo/g. Solo recuerde que .es un metacarácter, por lo que debe escapar o ponerlo entre paréntesis ( \.o [.]). Aquí hay una opción:

var str = '6.000.000';
str.replace(/[.]/g,",");
Nick Benes
fuente
1
sí, un reemplazo sin una expresión regular solo reemplaza una aparición del personaje.
Aukhan
2

Puedes usar esta función. Reemplazará las comas con '' y luego analizará el valor del plano y luego ajustará nuevamente el valor de las comas.

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;
    }
Muhammad Bilal
fuente
-1

Tratar

let str ="554,20";
let float = +str.replace(',','.');
let int = str.split(',').map(x=>+x);

console.log({float,int});

Kamil Kiełczewski
fuente