Estou precisando de uma função JavaScript que possa pegar um valor e preenchê-lo em um determinado comprimento (preciso de espaços, mas qualquer coisa faria). Eu achei isto:
Código:
String.prototype.pad = function(l, s, t){
return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
+ 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
+ this + s.substr(0, l - t) : this;
};
Exemplo:
<script type="text/javascript">
//<![CDATA[
var s = "Jonas";
document.write(
'<h2>S = '.bold(), s, "</h2>",
'S.pad(20, "[]", 0) = '.bold(), s.pad(20, "[]", 0), "<br />",
'S.pad(20, "[====]", 1) = '.bold(), s.pad(20, "[====]", 1), "<br />",
'S.pad(20, "~", 2) = '.bold(), s.pad(20, "~", 2)
);
//]]>
</script>
Mas eu não tenho idéia do que diabos está fazendo e não parece funcionar para mim.
javascript
string
Anthony Potts
fonte
fonte
Respostas:
Encontrei esta solução aqui e isso é para mim muito mais simples:
E aqui eu fiz uma extensão para o objeto string:
Um exemplo para usá-lo:
Isso retornará um horário no formato "15:30"
fonte
String
bibliotecas JSString.padStart()
eString.padEnd()
para preenchimento esquerdo / direito.Um método mais rápido
Se você estiver fazendo isso repetidamente, por exemplo, para preencher valores em uma matriz, e o desempenho for um fator, a abordagem a seguir pode oferecer quase uma vantagem de 100x na velocidade ( jsPerf ) em relação a outras soluções atualmente discutidas nas redes. A idéia básica é que você esteja fornecendo à função pad uma string vazia totalmente preenchida para usar como buffer. A função pad apenas anexa à string a ser adicionada a essa string pré-preenchida (concat de uma string) e, em seguida, corta ou corta o resultado no comprimento desejado.
Por exemplo, para zerar um número com 10 dígitos,
Para preencher uma string com espaço em branco, a string inteira tem 255 caracteres,
Teste de performance
Veja o teste jsPerf aqui .
E isso é mais rápido que o ES6
string.repeat
em 2x também, como mostra o JsPerf revisado aquifonte
string.repeat
método ES6 . Portanto, se você estiver fazendo um monte de preenchimento de cordas, definitivamente tente isso.http://www.webtoolkit.info/javascript_pad.html
É muito mais legível.
fonte
pad("hello", 20) = "hello "
Aqui está uma abordagem recursiva.
Um exemplo...
fonte
String.prototype.padStart()
eString.prototype.padEnd()
atualmente são propostas de candidatos ao TC39: consulte github.com/tc39/proposal-string-pad-start-end (disponível apenas no Firefox a partir de abril de 2016; um polyfill está disponível).fonte
myString.padStart(padLength [, padString])
emyString.padEnd(padLength [, padString])
O ECMAScript 2017 adiciona um método padStart ao protótipo String. Este método irá preencher uma string com espaços para um determinado comprimento. Esse método também usa uma sequência opcional que será usada em vez de espaços para preenchimento.
Também foi adicionado um método padEnd que funciona da mesma maneira.
Para compatibilidade do navegador (e um polyfill útil), consulte este link .
fonte
Usando o método ECMAScript 6, String # repeat , uma função pad é tão simples quanto:
String#repeat
atualmente é suportado apenas no Firefox e Chrome. para outra implementação, pode-se considerar o seguinte polyfill simples:fonte
Usando o método ECMAScript 6, String # repeat e Arrow , uma função pad é tão simples quanto:
jsfiddle
edit: sugestão dos comentários:
Dessa forma, ele não emitirá um erro quando
s.length
for maior quen
edit2: sugestão dos comentários:
Dessa forma, você pode usar a função para cadeias e não cadeias.
fonte
s.length
for maior don
que o esperado. Sugerir:let leftPad = (s, c, n) => n - s.length > 0 ? c.repeat(n - s.length) + s : s;
leftPad(12, ' ', 5)
. Embora eu saiba estritamente que isso pode ser bom, é provavelmente um dos casos de uso mais comuns (números de preenchimento). Talvezfunction leftPad(s, c, n) { s = s.toString(); return s.length > len ? s : c.repeat(n - s.length) + s; }
. Usar osfunction
meios leftPad pode estar na parte inferior do arquivo. Caso contrário, você provavelmenteconst
não deve usar nemvar
nemlet
.len
?len
deveria sern
O principal truque nessas duas soluções é criar uma
array
instância com um determinado tamanho (um a mais que o comprimento desejado) e, em seguida, chamar imediatamente ojoin()
método para criar astring
. Ojoin()
método é passado no preenchimentostring
(espaços provavelmente). Como o campoarray
está vazio, as células vazias serão renderizadas como vaziasstrings
durante o processo de união doarray
resultado em umstring
e apenas o preenchimento permanecerá. É uma técnica muito boa.fonte
bloco com valores padrão
Notei que eu principalmente preciso do padLeft para conversão de tempo / preenchimento de número
então eu escrevi essa função
Esta função simples suporta Number ou String como entrada
pad padrão é 2 caracteres
o padrão é 0
então eu posso simplesmente escrever
se eu adicionar o segundo argumento (largura do bloco)
terceiro parâmetro (pad char)
EDIT @BananaAcid se você passar um valor indefinido ou uma string de 0, obtém .. so
0undefined
:como sugerido
mas isso também pode ser alcançado de maneira mais curta.
trabalha também com:
E se você deseja poder de ambos os modos:
que pode ser escrito de maneira mais curta sem usar fatia.
Agora, se você tentar preencher 'averylongword' com 2 ... isso não é problema meu.
Disse que eu te dou uma dica.
Na maioria das vezes, se você o pressiona, o mesmo valor N vezes.
Usar qualquer tipo de função dentro de um loop diminui o ciclo !!!
Portanto, se você quiser deixar alguns números em uma longa lista, não use funções para fazer isso de maneira simples.
use algo como isto:
se você não souber como o tamanho máximo de preenchimento é baseado nos números dentro da matriz.
fonte
return (new Array((b||1)+1).join(c||0)+(a||'')).slice(-(b||2))
. E como sempre: vocês por aí, não copiem apenas o código que não entendem.Com o ES8, existem duas opções para preenchimento.
Você pode verificá-los na documentação.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
fonte
Tomando as idéias de Samuel, aqui em cima. E lembre-se de um script SQL antigo, tentei com isso:
Funciona em todos os casos que eu poderia imaginar:
fonte
A string de preenchimento foi implementada na nova versão javascript.
str.padStart(targetLength [, padString])
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/padStart
Se você deseja sua própria função, verifique este exemplo:
fonte
Aqui está uma função simples que eu uso.
Por exemplo:
fonte
Um caminho curto:
Exemplo:
retorno: "001234"
fonte
String.prototype.padStart()
devesse ser mais fácil.O es7 é apenas rascunhos e propostas no momento, mas se você deseja acompanhar a compatibilidade com as especificações, suas funções de bloco precisam:
Da minha biblioteca de polyfill, mas aplique sua própria diligência para extensões de protótipo.
fonte
Aqui está uma resposta simples em basicamente uma linha de código.
Certifique-se de que o número de caracteres em seu preenchimento, zeros aqui, seja pelo menos o comprimento mínimo pretendido. Então, realmente, para colocá-lo em uma linha, obter um resultado de "00035" neste caso é:
fonte
As manipulações de matriz são realmente lentas se comparadas a concatenações simples de strings. Obviamente, faça referência ao seu caso de uso.
fonte
Uma variante da resposta de @Daniel LaFavers .
Por exemplo:
fonte
Estamos em 2014 e sugiro uma função de preenchimento de string Javascript. Ha!
Ossos nus: almofada direita com espaços
Fantasia: almofada com opções
Uso (fantasia):
fonte
Se você não se importa em incluir uma biblioteca de utilitários, a biblioteca lodash possui as funções _.pad, _.padLeft e _.padRight .
fonte
Eu acho que é melhor evitar recursão porque é caro.
fonte
Aqui está uma função JavaScript que adiciona um número especificado de preenchimentos com symble personalizado. a função usa três parâmetros.
fonte
E então você pode fazer:
fonte
Se você quiser apenas uma linha de hacky muito simples para preencher, basta criar uma sequência do caractere de preenchimento desejado com o comprimento máximo de preenchimento desejado e, em seguida, colocar a substring no comprimento do que você deseja preencher.
Exemplo: preencher o armazenamento de cadeias
e
com espaços com 25 caracteres.Resultado:
"hello "
Se você quiser fazer o mesmo com um número como entrada, basta ligar
.toString()
antes.fonte
Array(n).join(c)
configurar o comprimento e o caractere do preenchimento, por exemploArray(26).join(' ')
.ainda outra abordagem com a combinação de algumas soluções
fonte
Um amigo perguntou sobre o uso de uma função JavaScript para pressionar para a esquerda. Isso se transformou em um pouco de esforço entre alguns de nós no bate-papo para codificá-lo. Este foi o resultado:
Ele garante que o valor a ser preenchido seja uma sequência e, se não for o comprimento do comprimento total desejado, ele será preenchido uma vez e depois será recursivo. Aqui está o que parece com uma nomeação e estrutura mais lógicas
O exemplo que estávamos usando era garantir que os números fossem preenchidos
0
à esquerda para formar um comprimento máximo de 6. Aqui está um exemplo:fonte
Um pouco tarde, mas pensei que eu poderia compartilhar de qualquer maneira. Achei útil adicionar uma extensão de protótipo ao Object. Dessa forma, posso digitar números e seqüências de caracteres, esquerda ou direita. Eu tenho um módulo com utilitários semelhantes que incluo nos meus scripts.
~~~~~~~~~~~~ jsAddOns.js ~~~~~~~~~~~~
fonte
str = pad + str;
), pois os dados serão realocados toda vez. Anexar sempre no final!str += pad;
). É muito mais rápido anexar a string de preenchimento a ela mesma e extrair os primeiros x-chars (o analisador pode fazer isso com eficiência se você extrair do primeiro char). Isso é crescimento exponencial, o que significa que desperdiça alguma memória temporariamente (você não deve fazer isso com textos extremamente grandes).fonte
Aqui está minha opinião
Não tenho tanta certeza sobre o desempenho, mas acho muito mais legível do que outras opções que vi por aqui ...
fonte