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 parseInt
e parseFloat
. Como posso fazer isso?
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 parseInt
e parseFloat
. Como posso fazer isso?
Respostas:
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(",", "."));
+(string)
vez de parseString(string)
sugerir o @Stev abaixo. Então, o primeiro exemplo seria v1 = +(values[0]); v2 = +(values[1]);
.
6.000.000
. Função só Substituir Substituir primeiro separador de vírgula
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(/,/,'.'));
+(str)
solução - parseFloat
ignora caracteres inválidos após o número, +(str)
retorna NaN
nesses casos, que é exatamente o que eu preciso.
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,99
os que podem ser eliminados anteriormente com outro replace
:
var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))
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"
@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,",");
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;
}
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
Experimentar
let str ="554,20";
let float = +str.replace(',','.');
let int = str.split(',').map(x=>+x);
console.log({float,int});