Como converter string em float em JavaScript?

255

Estou tentando analisar dois valores de um datagrid. Os campos são numéricos e, quando possuem uma vírgula (ex. 554,20), não consigo obter os números após a vírgula. Eu tentei parseInte parseFloat. Como posso fazer isso?

Kamil Kiełczewski
fonte
veja também: stackoverflow.com/questions/24318654
dreftymac

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(",", "."));
Jesse Rusak
fonte
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(/,/,'.'));
Stev
fonte
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(",","."))
Wadih M.
fonte
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"
sobi3ch
fonte
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,",");
Nick Benes
fonte
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;
    }
Muhammad Bilal
fonte
0

Eu tive o mesmo problema, exceto que não sabia de antemão quais eram os separadores de milhares e o separador decimal. Acabei escrevendo uma biblioteca para fazer isso. Se você estiver interessado, aqui está: https://github.com/GuillaumeLeclerc/number-parsing

DARK_DUCK
fonte
-1

Experimentar

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

console.log({float,int});

Kamil Kiełczewski
fonte