Estou tentando imprimir um número inteiro em JavaScript com vírgulas como separadores de milhares. Por exemplo, quero mostrar o número 1234567 como "1.234.567". Como eu faria isso?
Aqui está como eu estou fazendo isso:
function numberWithCommas(x) {
x = x.toString();
var pattern = /(-?\d+)(\d{3})/;
while (pattern.test(x))
x = x.replace(pattern, "$1,$2");
return x;
}
Existe uma maneira mais simples ou mais elegante de fazer isso? Seria bom se ele trabalha com carros alegóricos também, mas isso não é necessário. Não precisa ser específico do local para decidir entre pontos e vírgulas.
javascript
formatting
numbers
Elias Zamaria
fonte
fonte
Number.prototype.toLocaleString
ainda não funciona no Safari, em 2016 . Em vez de realmente formatar o número, ele apenas retorna, sem erro. Tendo a maior facepalm hoje como um resultado de que ... #goodworkAppleRespostas:
Usei a ideia da resposta de Kerry, mas a simplifiquei, pois estava apenas procurando algo simples para o meu propósito específico. Aqui está o que eu fiz:
Mostrar snippet de código
O regex usa 2 asserções lookahead:
Por exemplo, se você a passar
123456789.01
, a afirmação positiva corresponderá a todos os pontos à esquerda dos 7 (já que789
é um múltiplo de 3 dígitos,678
é um múltiplo de 3 dígitos567
, etc.). A asserção negativa verifica se o múltiplo de 3 dígitos não possui nenhum dígito depois dele.789
tem um período depois dele, então é exatamente um múltiplo de 3 dígitos, então uma vírgula vai para lá.678
é um múltiplo de 3 dígitos, mas possui um9
depois, portanto esses 3 dígitos fazem parte de um grupo de 4 e uma vírgula não vai para lá. Da mesma forma para567
.456789
tem 6 dígitos, que é um múltiplo de 3, então uma vírgula é anterior a isso.345678
é um múltiplo de 3, mas tem um9
depois, portanto, nenhuma vírgula vai para lá. E assim por diante. o\B
impede que o regex coloque vírgula no início da string.@ neu-rah mencionou que esta função adiciona vírgulas em locais indesejáveis se houver mais de 3 dígitos após o ponto decimal. Se este for um problema, você pode usar esta função:
Mostrar snippet de código
@ tjcrowder apontou que agora que o JavaScript está oculto ( informações de suporte ), ele pode ser resolvido na própria expressão regular:
Mostrar snippet de código
(?<!\.\d*)
é um aspecto negativo que indica que a correspondência não pode ser precedida por um.
seguido por zero ou mais dígitos. O lookbehind negativo é mais rápido que a soluçãosplit
ejoin
( comparação ), pelo menos na V8.fonte
Estou surpreso que ninguém tenha mencionado Number.prototype.toLocaleString . Ele foi implementado no JavaScript 1.5 (que foi introduzido em 1999) e, portanto, é basicamente suportado nos principais navegadores.
Também funciona no Node.js a partir da v0.12 através da inclusão de Intl
Apenas preste atenção que esta função retorna uma string, não um número.
Se você quiser algo diferente, o Numeral.js pode ser interessante.
fonte
var number = 123456.000; number.toLocaleString('en-US', {minimumFractionDigits: 2}); "123,456.00"
essas opções não funcionam no FF ou no Safari.X XXX XXX,YYY
).toLocaleString
funciona no Node.js a partir da v0.12 por meio da inclusão do Intl .parseInt("1234567", 10).toLocaleString('en-US', {minimumFractionDigits: 2})
ounew Number("1234567").toLocaleString('en-US', {minimumFractionDigits: 2})
não. Não funciona porque você o usa em uma string, não em um número.⚠ Lembre-se de que o javascript tem um valor inteiro máximo de 9007199254740991
toLocaleString :
NumberFormat ( Safari não suportado):
Pelo que verifiquei (Firefox pelo menos), ambos são mais ou menos iguais em relação ao desempenho.
fonte
toLocaleString
obras sobre safari, opções nãotoLocaleString
solução provavelmente também deve incluir o local desejado, portantotoLocaleString("en")
, porque o padrão em inglês usa vírgulas. No entanto, se otoLocaleString()
indicador sem local for executado na França, ele produzirá períodos em vez de vírgulas, porque é isso que é usado para separar milhares localmente.Sugiro usar o number_format () do phpjs.org
ATUALIZAÇÃO 13/02/14
As pessoas têm relatado que isso não funciona como esperado, então eu fiz um JS Fiddle que inclui testes automatizados.
Atualização 26/11/2017
Aqui está o violino como um snippet de pilha com saída levemente modificada:
fonte
Esta é uma variação da resposta de @ mikez302, mas modificada para suportar números com decimais (de acordo com o feedback de @ neu-rah que numberWithCommas (12345.6789) -> "12.345.6.789" em vez de "12.345.6789"
fonte
fonte
Usando expressão regular
Usando toLocaleString ()
ref MDN: Number.prototype.toLocaleString ()
Usando Intl.NumberFormat ()
ref Intl.NumberFormat
DEMO AQUI
atuação
http://jsben.ch/sifRd
fonte
Intl.NumberFormat
Função JS nativa. Suportado pelo IE11, Edge, Safari mais recente, Chrome, Firefox, Opera, Safari no iOS e Chrome no Android.
fonte
Obrigado a todos por suas respostas. Eu desenvolvi algumas das respostas para criar uma solução mais "tamanho único".
O primeiro trecho acrescenta uma função que imita PHP é
number_format()
para o protótipo Number. Se estou formatando um número, normalmente quero casas decimais, para que a função receba o número de casas decimais a serem exibidas. Alguns países usam vírgulas como decimais e decimais como separador de milhares, para que a função permita que esses separadores sejam definidos.Você usaria isso da seguinte maneira:
Descobri que muitas vezes precisava recuperar o número para operações matemáticas, mas o parseFloat converte 5.000 em 5, simplesmente obtendo a primeira sequência de valores inteiros. Então, criei minha própria função de conversão de flutuador e a adicionei ao protótipo String.
Agora você pode usar as duas funções da seguinte maneira:
fonte
var parts = this.toFixed(decimals).toString().split('.');
var dec_point
. Obrigado por apontar isso.Estou bastante impressionado com o número de respostas que esta pergunta tem. Eu gosto da resposta de uKolka :
Infelizmente, porém, em alguns locais como o espanhol, ele não funciona (IMHO) conforme o esperado para números abaixo de 10.000:
Dá
1000
e não1.000
.Consulte toLocaleString que não funciona em números inferiores a 10000 em todos os navegadores para saber o motivo.
Então, eu tive que usar a resposta de Elias Zamaria escolhendo o caractere separador de milhares certo:
Este funciona bem como uma linha para ambos os locais que usam
,
ou.
como separador de milhares e começa a trabalhar a partir de 1.000 em todos os casos.Fornece
1.000
com um contexto de localidade em espanhol.Se você deseja ter controle absoluto sobre a formatação de um número, tente também o seguinte:
Dá
1,234.57
.Este não precisa de uma expressão regular. Ele funciona ajustando o número para a quantidade desejada de decimais com
toFixed
primeiro e, em seguida, dividindo-o em torno do ponto decimal,.
se houver um. O lado esquerdo é então transformado em uma matriz de dígitos que é revertida. Em seguida, um separador de milhares é adicionado a cada três dígitos desde o início e o resultado é revertido novamente. O resultado final é a união das duas partes. O sinal do número de entrada é removidoMath.abs
primeiro e depois recolocado, se necessário.Não é uma linha, mas não muito mais longa e facilmente transformada em função. As variáveis foram adicionadas para maior clareza, mas essas podem ser substituídas pelos valores desejados, se forem conhecidos com antecedência. Você pode usar as expressões usadas
toLocaleString
para descobrir os caracteres corretos para o ponto decimal e o separador de milhares para o código do idioma atual (lembre-se de que esses requerem um Javascript mais moderno).fonte
Eu acho que essa é a expressão regular mais curta que faz isso:
Eu verifiquei em alguns números e funcionou.
fonte
Number.prototype.toLocaleString()
teria sido incrível se fosse fornecido nativamente por todos os navegadores (Safari) .Eu verifiquei todas as outras respostas, mas ninguém parecia preenchê-lo. Aqui está um ponto a favor disso, que na verdade é uma combinação das duas primeiras respostas; se
toLocaleString
funciona, usa-o; caso contrário, usa uma função personalizada.fonte
0.12345
será exibido0.12,345
. Uma boa aplicação para isso pode ser encontrada no underscore.stringvalue > 1000
condição if corrige esse caso, no entanto, esse foi um problema e, é claro, versões mais testadas podem ser encontradas em outros lugares, obrigado por apontar.value > 1000
, porque seria o mesmo para qualquer número e com mais de três casas decimais. por exemplo,1000.12345
retornos1,000.12,345
. Sua resposta é ótima e no caminho certo, mas não está completa. Eu só estava tentando apontar para outras pessoas que podem tropeçar na sua resposta e apenas copiar / colar sem testar com dados de entrada diferentes.O separador de milhares pode ser inserido de maneira internacional, usando o
Intl
objeto do navegador :Consulte o artigo da MDN sobre NumberFormat para obter mais informações, você pode especificar o comportamento da localidade ou o padrão para o usuário. Isso é um pouco mais infalível, porque respeita as diferenças locais; muitos países usam períodos para separar dígitos, enquanto uma vírgula indica os decimais.
O Intl.NumberFormat ainda não está disponível em todos os navegadores, mas funciona nos mais recentes Chrome, Opera e IE. O próximo lançamento do Firefox deve suportá-lo. O Webkit não parece ter um cronograma para implementação.
fonte
Você pode usar este procedimento para formatar sua moeda.
Para mais informações, você pode acessar este link.
https://www.justinmccandless.com/post/formatting-currency-in-javascript/
fonte
se você estiver lidando com valores de moeda e formatando muito, talvez valha a pena adicionar o accounting.js minúsculo, que lida com muitos casos extremos e localização:
fonte
O código a seguir usa char scan, portanto, não há regex.
Ele mostra um desempenho promissor: http://jsperf.com/number-formatting-with-commas/5
26/04/2015: Correção menor para resolver o problema quando num <0. Consulte https://jsfiddle.net/runsun/p5tqqvs3/
fonte
commafy(-123456)
que dá #-,123,456
Aqui está uma função simples que insere vírgulas para milhares de separadores. Ele usa funções de matriz em vez de um RegEx.
Link do CodeSandbox com exemplos: https://codesandbox.io/s/p38k63w0vq
fonte
Use este código para lidar com o formato de moeda da Índia. O código do país pode ser alterado para lidar com a moeda de outro país.
resultado:
fonte
Você também pode usar o construtor Intl.NumberFormat . Aqui está como você pode fazer isso.
fonte
Eu escrevi este antes de tropeçar neste post. Sem regex e você pode realmente entender o código.
fonte
EDIT: A função funciona apenas com número positivo. por exemplo:
Saída: "123,123,231,232"
Mas, para responder à pergunta acima, o
toLocaleString()
método apenas resolve o problema.Saída: "123,123,231,232"
Elogio!
fonte
Minha resposta é a única resposta que substitui completamente o jQuery por uma alternativa muito mais sensata:
Essa solução não apenas adiciona vírgulas, mas também arredonda para o centavo mais próximo, caso você insira uma quantia como a de
$(1000.9999)
US $ 1.001,00. Além disso, o valor inserido pode ser um número ou uma string com segurança; Não importa.Se você está lidando com dinheiro, mas não quer um cifrão à esquerda, também pode adicionar esta função, que usa a função anterior, mas remove
$
:Se você não está lidando com dinheiro e tem vários requisitos de formatação decimal, aqui está uma função mais versátil:
Ah, e a propósito, o fato de esse código não funcionar em alguma versão antiga do Internet Explorer é completamente intencional. Eu tento interromper o IE a qualquer momento que eu possa pegá-lo sem suportar os padrões modernos.
Lembre-se de que elogios excessivos, na seção de comentários, são considerados fora de tópico. Em vez disso, apenas me regue com votos positivos.
fonte
Para mim, a melhor resposta é usar toLocaleString como alguns membros disseram. Se você deseja incluir o símbolo '$', basta adicionar o idioma e digitar as opções. Aqui está e exemplo para formatar um número para pesos mexicanos
atalho
fonte
Deixe-me tentar melhorar a resposta do uKolka e talvez ajudar outras pessoas a economizar algum tempo.
Use Numeral.js .
Você deve usar Number.prototype.toLocaleString () apenas se a compatibilidade do navegador não for um problema.
fonte
Uma maneira alternativa, suportando decimais, diferentes separadores e negativos.
Algumas correções feitas por @Jignesh Sanghani, não se esqueça de votar neste comentário.
fonte
fn.substr(0, i)
substitua porn.substr(0, i)
e tambémnumber.toFixed(dp).split('.')[1]
substitua porparseFloat(number).toFixed(dp).split('.')[1]
. porque quando eu uso diretamente é me dar um erro. atualize seu códigoEu acho que essa função cuidará de todos os problemas relacionados a esse problema.
fonte
Apenas para futuros googlers (ou não necessariamente 'googlers'):
Todas as soluções mencionadas acima são maravilhosas, no entanto, o RegExp pode ser uma coisa muito ruim de se usar em uma situação como essa.
Então, sim, você pode usar algumas das opções propostas ou até escrever algo primitivo, mas útil como:
O regexp usado aqui é bastante simples e o loop será precisamente o número de vezes necessário para concluir o trabalho.
E você pode otimizar muito melhor o código "DRYify" e assim por diante.
Ainda,
(na maioria das situações) seria uma escolha muito melhor.
O ponto não está na velocidade de execução ou na compatibilidade entre navegadores.
Nas situações em que você deseja mostrar o número resultante ao usuário, o método .toLocaleString () fornece a você o poder de falar o mesmo idioma com o usuário do seu site ou aplicativo (qualquer que seja o idioma dele).
Esse método, de acordo com a documentação do ECMAScript, foi introduzido em 1999, e acredito que a razão disso tenha sido a esperança de que a Internet, em algum momento, conectasse pessoas em todo o mundo, portanto, eram necessárias algumas ferramentas de "internalização".
Hoje a Internet conecta todos nós, portanto, é importante lembrar que o mundo é muito mais complexo do que imaginamos e que (/ quase) todos nós estamos aqui , na Internet.
Obviamente, considerando a diversidade de pessoas, é impossível garantir a experiência do usuário perfeita para todos, porque falamos idiomas diferentes, valorizamos coisas diferentes, etc. E exatamente por isso, é ainda mais importante tentar localizar as coisas o máximo possível .
Portanto, considerando que existem alguns padrões específicos para representação de data, hora, números etc. e que temos uma ferramenta para exibir essas coisas no formato preferido pelo usuário final, não é raro e quase irresponsável não usar essa ferramenta (especialmente em situações em que queremos exibir esses dados para o usuário)?
Para mim, usar RegExp em vez de .toLocaleString () em situações como essa parece um pouco como criar um aplicativo de relógio com JavaScript e codificá-lo de maneira a exibir apenas o tempo de Praga (o que seria bastante inútil para pessoas que não vivem em Praga), embora o comportamento padrão de
é retornar os dados de acordo com o relógio do usuário final.
fonte
Minha " verdadeira " solução apenas de expressões regulares para aqueles que adoram uma só palavra
Você vê esses jogadores entusiasmados acima? Talvez você possa jogar fora disso. Aqui está o meu derrame.
Usa um
ESPAÇO FINO (U + 2009) para um separador de milhares, como o Sistema Internacional de Unidades disse na oitava edição (2006) de sua publicação “ Brochura da SI: Sistema Internacional de Unidades (SI) ” (Veja §5.3 .4.). A nona edição (2019) sugere usar um espaço para isso (ver §5.4.4.). Você pode usar o que quiser, incluindo uma vírgula.
Vejo.
Como funciona?
Para uma parte inteira
.replace(……, " I ")
Coloque "eu"/……/g
em cada um\B
entre dois dígitos adjacentes(?=……)
VISÃO POSITIVA cuja parte direita é(\d{3})+
um ou mais pedaços de três dígitos\b
seguido por um não dígito, como um ponto final, o fim da string, etc.(?<!……)
OLHAR NEGATIVO, excluindo aqueles cuja parte esquerda\.\d+
é um ponto seguido de dígitos ("possui um separador decimal").Para uma parte decimal
.replace(……, " F ")
Coloque "F"/……/g
em cada um\B
entre dois dígitos adjacentes(?<=……)
VISUALIZAÇÃO POSITIVA, cuja parte esquerda é\.
um separador decimal(\d{3})+
seguido por um ou mais blocos de três dígitos.Classes e limites de caracteres
Compatibilidade do navegador
fonte
Adicionei tofixed à solução do Aki143S . Esta solução usa pontos para separadores de milhares e vírgula para precisão.
Exemplos;
fonte
Muitas boas respostas já. Aqui está outro, apenas por diversão:
Alguns exemplos:
fonte
format(-123456)
que dá #-,123,456