Qual é a maneira recomendada de preencher um valor em JavaScript? Eu imagino que eu poderia criar uma função personalizada para zeros em um valor normal, mas estou me perguntando se existe uma maneira mais direta de fazer isso?
Nota: Por "preenchido com zerado", quero dizer isso no sentido de palavra-chave do banco de dados (onde uma representação preenchida com zerado de 6 dígitos do número 5 seria "000005").
javascript
zerofill
Wilco
fonte
fonte
npm install sprintf-js
e exija-o no arquivo que você precisa:sprintf('%0d6', 5);
function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;}
... assumindo quen
não é negativowhile
fim de Acesson.length
mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Respostas:
Uma função simples é tudo que você precisa
você pode assar isso em uma biblioteca se quiser conservar o espaço para nome ou o que for. Como com a extensão do jQuery .
fonte
Maneira simples. Você pode adicionar multiplicação de strings para o bloco e transformá-lo em uma função.
Como uma função,
fonte
paddy (888, 2)
produz88
e não888
conforme necessário. Esta resposta também não lida com números negativos.Não acredito em todas as respostas complexas aqui ... Basta usar isso:
fonte
Na verdade, tive que inventar algo assim recentemente. Imaginei que tinha que haver uma maneira de fazer isso sem usar loops.
Isto é o que eu vim com.
Em seguida, use-o fornecendo um número para zero pad:
Se o número for maior que o preenchimento, o número será expandido além do preenchimento:
Os decimais também são bons!
Se você não se importa de poluir o espaço para nome global, pode adicioná-lo diretamente ao Number:
E se você preferir que os decimais ocupem espaço no preenchimento:
Felicidades!
O XDR apresentou uma variação logarítmica que parece ter um desempenho melhor.
AVISO : Esta função falha se num for igual a zero (por exemplo, zeropad (0, 2))
Por falar em desempenho, o tomsmeding comparou as 3 principais respostas ( 4 com a variação do log ). Adivinhar qual majorly superou os outros dois? :)
fonte
numZeros
parâmetro, pois é enganoso. Não é o número de zeros que você deseja adicionar, é o tamanho mínimo que o número deve ter. Um nome melhor serianumLength
ou mesmolength
.num
pode ser zero ...Aqui está o que eu costumava preencher um número de até 7 caracteres.
Essa abordagem provavelmente será suficiente para a maioria das pessoas.
Edit: Se você quiser torná-lo mais genérico, você pode fazer isso:
Edit 2: Observe que, desde o ES2017, você pode usar
String.prototype.padStart
:fonte
number = 123456789
, com o código acima, por exemplo.new String
. Você pode apenas usar literais de string.(new Array(padding + 1).join("0")
pode ser substituído por"0".repeat(padding)
Navegadores modernos agora suportam
padStart
, você pode simplesmente:Exemplo:
fonte
Infelizmente, existem muitas sugestões complicadas e desnecessárias para esse problema, geralmente envolvendo a criação de sua própria função para manipulação matemática ou de seqüências de caracteres ou a chamada de um utilitário de terceiros. No entanto, existe uma maneira padrão de fazer isso na biblioteca JavaScript base com apenas uma linha de código. Pode valer a pena agrupar essa linha de código em uma função para evitar precisar especificar parâmetros que você nunca deseja alterar, como o nome ou o estilo local.
Isso produzirá o valor de "005" para o texto. Você também pode usar a função toLocaleString de Number para preencher zeros no lado direito do ponto decimal.
Isso produzirá o valor de "5,00" para o texto. Altere useGrouping para true para usar separadores de vírgula para milhares.
Observe que o uso de
toLocaleString()
withlocales
eoptions
argumentos é padronizado separadamente no ECMA-402 , não no ECMAScript. Atualmente, alguns navegadores implementam apenas o suporte básico , ou seja,toLocaleString()
podem ignorar qualquer argumento.Exemplo completo
fonte
Se o número de preenchimento é conhecido antecipadamente por não exceder um determinado valor, há outra maneira de fazer isso sem loops:
Casos de teste aqui: http://jsfiddle.net/jfriend00/N87mZ/
fonte
-88
deve render"-00088"
, por exemplo.zeroFill(-88, 5)
deveria produzir-00088
ou-0088
? Eu acho que depende se você deseja que owidth
argumento tenha toda a largura do número ou apenas o número de dígitos (sem incluir o sinal negativo). Um implementador pode facilmente mudar o comportamento para não incluir o sinal negativo, apenas removendo a--width
linha de código.A maneira rápida e suja:
Para x = 5 e count = 6, você terá y = "000005"
fonte
y="0005"
com o acima exposto,y = (new Array(count + 1 - x.toString().length)).join('0') + x;
é o que me deuy="000005"
('0000'+n).slice(-4)
Aqui está uma função rápida que eu criei para fazer o trabalho. Se alguém tiver uma abordagem mais simples, sinta-se à vontade para compartilhar!
fonte
for
.vs.while
o desempenho não é diferente o suficiente para ser interessante: jsperf.com/fors-vs- whileCheguei atrasado para a festa aqui, mas costumo usar essa construção para fazer preenchimento ad-hoc de algum valor
n
, conhecido por ser um decimal positivo:Onde
offset
estão 10 ^^ dígitos.Por exemplo, preenchimento com 5 dígitos, onde n = 123:
A versão hexidecimal disso é um pouco mais detalhada:
Nota 1: Eu também gosto da solução do @ profitehlolz, que é a versão string disso, usando o recurso de índice negativo bacana do slice ().
fonte
Realmente não sei por que, mas ninguém fez isso da maneira mais óbvia. Aqui está a minha implementação.
Função:
Protótipo:
Muito simples, não vejo como isso pode ser mais simples. Por alguma razão, eu pareço muitas vezes aqui no SO, as pessoas tentam evitar os loops 'for' e 'while' a qualquer custo. O uso de regex provavelmente custará muito mais ciclos para um preenchimento tão trivial de 8 dígitos.
fonte
Eu uso esse snipet para obter uma representação de 5 dígitos
fonte
ECMAScript 2017: use padStart ou padEnd
Mais informações:
fonte
O poder da matemática!
x = número inteiro a ser preenchido
y = número de zeros a ser preenchido
fonte
Não vi ninguém apontar o fato de que, quando você usa String.prototype.substr () com um número negativo, conta da direita.
Uma solução de uma linha para a pergunta do OP, uma representação preenchida por zeros de 6 dígitos do número 5, é:
Generalizando, obteremos:
fonte
Depois de muito, muito tempo testando 15 funções / métodos diferentes encontrados nas perguntas, agora sei qual é o melhor (o mais versátil e o mais rápido).
Tirei 15 funções / métodos das respostas a esta pergunta e fiz um script para medir o tempo necessário para executar 100 blocos. Cada bloco preencheria o número
9
com2000
zeros. Isso pode parecer excessivo e é, mas fornece uma boa idéia sobre o dimensionamento das funções.O código que usei pode ser encontrado aqui: https://gist.github.com/NextToNothing/6325915
Sinta-se livre para modificar e testar o código você mesmo.
Para obter o método mais versátil, você precisa usar um loop. Isso ocorre porque, com números muito grandes, é provável que outros falhem, enquanto isso será bem-sucedido.
Então, qual loop usar? Bem, isso seria um
while
loop. Umfor
loop ainda é rápido, maswhile
é apenas um pouco mais rápido (alguns ms) - e mais limpo.Respostas como essas de
Wilco
,Aleksandar Toplek
ouVitim.us
farão o trabalho perfeitamente.Pessoalmente, tentei uma abordagem diferente. Tentei usar uma função recursiva para preencher a string / número. Funcionou melhor do que métodos para ingressar em uma matriz, mas, ainda assim, não funcionou tão rápido quanto um loop for.
Minha função é:
Você pode usar minha função com ou sem definir a variável padding. Então assim:
Pessoalmente, após meus testes, eu usaria um método com um loop while, como
Aleksandar Toplek
ouVitim.us
. No entanto, eu o modificaria um pouco para que você possa definir a string de preenchimento.Então, eu usaria este código:
Você também pode usá-lo como uma função de protótipo, usando este código:
fonte
O primeiro parâmetro é qualquer número real, o segundo parâmetro é um número inteiro positivo que especifica o número mínimo de dígitos à esquerda do ponto decimal e o terceiro parâmetro é um número inteiro positivo opcional que especifica o número se houver dígitos à direita do ponto decimal.
tão
fonte
Não reinvente a roda, use a string sublinhada :
jsFiddle
fonte
Esta é a solução ES6.
fonte
const numStr = String(num)
ereturn '0'.repeat(len - numStr.length) + numStr;
Em todos os navegadores modernos, você pode usar
Aqui está a referência do MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
fonte
Não que essa pergunta precise de mais respostas, mas pensei em adicionar a versão lodash simples disso.
_.padLeft(number, 6, '0')
fonte
var zfill = _.partialRight(_.padStart, '0');
npm install --save lodash.padleft
então,import padLeft from 'lodash.padleft'
e omitir o_.
A última maneira de fazer isso é muito mais simples:
output: "02"
fonte
(8).toLocaleString(undefined, {minimumIntegerDigits: 5})
retorna"00.008"
para mim, com base no meu local.Apenas mais uma solução, mas acho que é mais legível.
fonte
Este é menos nativo, mas pode ser o mais rápido ...
fonte
pad = count - (num + '').length
. números negativos não são bem tratados, mas, além disso, não é ruim. +1Minha solução
Uso
fonte
Por que não usar recursão?
fonte
Alguns monkeypatching também funcionam
fonte
pad(5, 0, 6)
=000005
pad('10', 0, 2)
=10 // don't pad if not necessary
pad('S', 'O', 2)
=SO
... etc
Felicidades
fonte
var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;
se você corrigir, eu removerei meu voto negativo.0
associação codificado) :) - Resposta atualizada.o mais simples solução, mais simples e direta você vai encontrar.
fonte