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


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(",", "."));

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(/,/,'.'));

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(",","."))

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"

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,",");

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;
    }


-1

Tratar

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

console.log({float,int});

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.