Como converter string em float em JavaScript?


Respostas:


371

Se eles pretendem ser valores separados, tente o seguinte:

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

Se eles tiverem um valor único (como em francês, onde metade é escrita 0,5)

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

6
E onde você tem uma vírgula usada como mil separadores? Por exemplo, 1234 escrito como 1.234
Chris B

6
Você pode simplesmente remover a vírgula e analisá-la. (por exemplo, substitua-o por "")
Jesse Rusak em

7
não é muito seguro, como sconto = parseFloat ("5,, 5" .replace (",", ".")); retorna 5 principais a crer que é um número válido, mas você solta a parte .5 ou você poderia considerar que não é um número válido
max4ever

1
@ max4ever Se você estiver preocupado em aceitar silenciosamente números inválidos, use-os, em +(string)vez de parseString(string)sugerir o @Stev abaixo. Então, o primeiro exemplo seria v1 = +(values[0]); v2 = +(values[1]);.
Jesse Rusak

1
FAIL, e se o meu número for 6.000.000. Função só Substituir Substituir primeiro separador de vírgula
GusDeCooL

55

Você já tentou fazer isso? : p

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

+ (string) converterá a string em float.

Handy!

Portanto, para resolver seu problema, você pode fazer algo assim:

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

7
Eu realmente gosto da +(str)solução - parseFloatignora caracteres inválidos após o número, +(str)retorna NaNnesses casos, que é exatamente o que eu preciso.
2828 Alex

34

Substitua a vírgula por um ponto.

Isso retornará apenas 554:

var value = parseFloat("554,20")

Isso retornará 554,20:

var value = parseFloat("554.20")

Então, no final, você pode simplesmente usar:

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

Não esqueça que parseInt()só deve ser usado para analisar números inteiros (sem pontos flutuantes). No seu caso, ele retornará apenas 554. Além disso, chamar parseInt () em um ponto flutuante não arredondará o número: ele ocupará seu piso (número inteiro inferior mais próximo).


Exemplo ampliado para responder à pergunta de Pedro Ferreira a partir dos comentários:

Se o campo de texto contiver milhares de pontos separadores, como 1.234.567,99os que podem ser eliminados anteriormente com outro replace:

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

E o "." separador de milhares? Como 4.554,20, o que retornaria ...?
Pedro Ferreira

16

Se você estender o objeto String como este ..

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

.. você pode executá-lo assim

"554,20".float()
> 554.20

funciona com ponto também

"554.20".float()
> 554.20

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

10
Embora geralmente seja considerado uma forma incorreta modificar os protótipos do objeto base. E se outra estrutura também tentasse fazer isso, mas a funcionalidade fosse diferente?
Phreakhead 22/01

3

@GusDeCool ou qualquer outra pessoa tentando substituir mais de separadores de milhares, uma maneira de fazê-lo é um regex substituição global: /foo/g. Lembre-se de que .é um metacaractere, portanto você precisa escapar ou colocá-lo entre colchetes ( \.ou [.]). Aqui está uma opção:

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

1
sim, uma substituição sem uma regex substitui apenas uma ocorrência do caractere.
Aukhan

2

Você pode usar esta função. Ele substituirá as vírgulas por '' e, em seguida, analisaráFlaot o valor e depois ajustará novamente as vírgulas em 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;
    }


-1

Experimentar

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

console.log({float,int});

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.