Eu tenho 2,299.00
uma string e estou tentando analisá-la em um número. Tentei usar parseFloat
, que resultou em 2. Acho que o problema é a vírgula, mas como resolveria esse problema da maneira certa? Basta remover a vírgula?
var x = parseFloat("2,299.00")
alert(x);
javascript
number-formatting
user1540714
fonte
fonte
.replace(/,/g, '')
Este regex usa o globalg
para substituir tudo.parseFloat("2,000,000.00".replace(',',''))
retorna2000
e 2. falha em muitas regiões do mundo onde,
é uma casa decimal, por exemplo,parseFloat("2.000.000,00".replace(',',''))
retorna2
- veja minha resposta abaixo para algo que funciona em qualquer lugar do mundo.Remover vírgulas é potencialmente perigoso porque, como outros mencionaram nos comentários, muitas localidades usam vírgulas para significar algo diferente (como uma casa decimal).
Eu não sei de onde você tirou sua corda, mas em alguns lugares do mundo
"2,299.00"
=2.299
O
Intl
objeto poderia ter sido uma boa maneira de resolver este problema, mas de alguma forma eles conseguiram enviar a especificação com apenas umaIntl.NumberFormat.format()
API e nenhumaparse
contraparte :(A única maneira de analisar uma string com caracteres numéricos culturais em um número reconhecível por máquina de qualquer maneira sã é usar uma biblioteca que aproveita os dados CLDR para cobrir todas as maneiras possíveis de formatar strings numéricas http: //cldr.unicode. org /
As duas melhores opções de JS que encontrei para isso até agora:
fonte
Em navegadores modernos, você pode usar o Intl.NumberFormat integrado para detectar a formatação de número do navegador e normalizar a entrada para corresponder.
Obviamente há espaço para alguma otimização e armazenamento em cache, mas isso funciona de maneira confiável em todas as linguagens.
fonte
Remova tudo o que não seja um dígito, ponto decimal ou sinal de menos (
-
):Violino atualizado
Observe que isso não funciona para números em notação científica. Se você deseja que ele, altere a
replace
linha para adicionare
,E
e+
para a lista de caracteres aceitáveis:fonte
str = str.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");
Isso é o que eu usaria, mas sou totalmente inútil em regex e é algo que encontrei há algum tempo em algum outro segmento do SO.parseFloat
- o que irá validá-lo. :-)Normalmente, você deve considerar o uso de campos de entrada que não permitem a entrada de texto livre para valores numéricos. Mas pode haver casos em que você precisa adivinhar o formato de entrada. Por exemplo 1.234,56 na Alemanha significa 1.234,56 nos EUA. Consulte https://salesforce.stackexchange.com/a/21404 para obter uma lista de países que usam vírgula como decimal.
Eu uso a seguinte função para fazer uma melhor estimativa e remover todos os caracteres não numéricos:
Experimente aqui: https://plnkr.co/edit/9p5Y6H?p=preview
Exemplos:
A função tem um ponto fraco: não é possível adivinhar o formato se você tiver 1.123 ou 1.123 - porque dependendo do formato do local, ambos podem ser uma vírgula ou um separador de milhares. Neste caso especial, a função tratará o separador como um separador de milhares e retornará 1123.
fonte
3,00 €
também foi substituído para 3,00. Apenas uma nota3,001
formatada para3001
. Para evitar isso, a entrada deve ser sempre com símbolos decimais. Por exemplo,3,001.00€
3,001.00
converte corretamente. Além disso, atualize o jsfiddle.0,124
ainda é convertido para 124É desconcertante que incluíram um toLocaleString, mas não um método de análise . Pelo menos toLocaleString sem argumentos é bem suportado no IE6 +.
Para uma solução i18n , pensei nisso:
Primeiro detecte o separador decimal de localidade do usuário:
Em seguida, normalize o número se houver mais de um separador decimal na string:
Por fim, remova tudo o que não seja um número ou separador decimal:
fonte
Este é um invólucro simples e discreto em torno da
parseFloat
função.fonte
Se você quiser evitar o problema que David Meister postou e tiver certeza do número de casas decimais, pode substituir todos os pontos e vírgulas e dividir por 100, ex .:
ou se você tiver 3 casas decimais
Você decide se deseja usar parseInt, parseFloat ou Number. Além disso, se você quiser manter o número de casas decimais, pode usar a função .toFixed (...).
fonte
Todas essas respostas falharão se você tiver um número na casa dos milhões.
3.456.789 simplesmente retornaria 3456 com o método de substituição.
A resposta mais correta para simplesmente remover as vírgulas teria que ser.
Ou simplesmente escrito.
fonte
Isso converte um número em qualquer local para um número normal. Funciona para pontos decimais também:
fonte
Com esta função você poderá formatar valores em vários formatos como
1.234,56
e1,234.56
, e até mesmo com erros como1.234.56
e1,234,56
fonte
Se você quer uma resposta l10n, faça desta forma. O exemplo usa moeda, mas você não precisa disso. A biblioteca internacional precisará ser polyfilled se você tiver que oferecer suporte a navegadores mais antigos.
fonte
replace()
apenas substitui a primeira correspondência quando não é usadoRegExp
com o'g'
sinalizador.,
que está em separador de vírgula em alguns locaisSubstitua a vírgula por uma string vazia:
fonte
Se você tiver um pequeno conjunto de localidades para oferecer suporte, provavelmente seria melhor apenas codificar algumas regras simples:
fonte
fonte
A função de divisão divide a string em uma matriz usando "," como separador e retorna uma matriz.
A função de junção junta os elementos da matriz retornada da função de divisão.
A função Number () converte a string associada em um número.
fonte