Javascript stuff
Publicado em Developer
alert(parseInt("12345"));
alert(parseInt("012345"));
O primeiro alert vai ficar certinho, vai retornar 12345, mas o segundo vai retornar 5349!!! O problema aí é que ele trata a string como um octal, por que começa com um zero.
Não que o número que passei seja um octal, mas a convenção da função é essa, do mesmomodo que qualquer coisa começada com 0x lá é tratada como um valor em hexadecimal, experimentem colocar um alert(parseInt("0xA")) para ver o número 10 aparecer.
E eu estava fazendo um script para passar os valores para um DELETE SQL, imaginem o estrago se não tivesse caído a ficha disso. Vale lembrar que no caso a convenção do formato do número era obrigatoriamente 6 dígitos, se necessários com zeros à esquerda.
A solução foi uma funçãozinha de retirar zeros à esquerda:
function stripLeftZeros(sStr){
var i;
for(i=0;i<sStr.length;i++)
if(sStr.charAt(i)!='0')
return sStr.substring(i);
return sStr;
}
Agora, o resultado de:
alert(stripLeftZeros(parseInt("12345")));
alert(stripLeftZeros(parseInt("012345")));
sempre vai ser 12345. Ah, apesar do var i; parecer redundante, ele evita que a váriavel seja misturada com alguma outra com o mesmo nome em alguma outra parte do script. Fica meio feinho mas não se esqueçam disso. ;-)
Update em 15:47: o mala-sem-alça do Jonas Galvez já veio enchendo os patová falando da possibilidade de usar na parseInt o segundo paramêtro, com a base numérica que você quer. Nesse caso, ficaria:
alert(parseInt("012345",10));
É mais bunitinho? É. Mas o X da coisa aqui não foi mostrar como otimizar a solução do problema, e sim o lance de decimal/octais/hexadecimais (eu havia esquecido do maldito do 0 no início, como disse acima). Eu errei em duas coisas:
1) Em deixar isso claro, qual o X desse post, que era alertar do octal.
2) Em que depois que escrevi isso não dei muita relevância à coisa e podia, lógico, ter falado do segundo paramêtro (vejam mais dele aqui), que, afinal, tem tudo a ver com as bases também.
Como já achei que tinha feito a minha parte, afinal, falei das basinhas, não me preocupei com o resto, escrevi isso e fui trabalhar. Mas fica meu agradecimento ao mala do Jonas (;-)) de ter me enviado uma mensagem "olha, seu lammer, faz assim, eu sou o fodão" e me lembrado que toda vez que eu (e você também!) postar alguma coisa de modo descompromissado é melhor eu ter atenção nos detalhes por que ele vai me aporrinhar mesmo ("mas meu filho, vamos discutir o jeito mais otimizado e ..." ... ahhhh, socorro!). O mala conseguiu fazer a gente enxugar uma funçãozinha de umas 8 linhas que ele fez para apenas 1, na lista de discussão do Python. Então não discutam com ele. ;-)
Agora que temos os pingos nos "is" você ainda leva de brinde uma funçãozinha para retirar zeros ... zero à esquerda é inútil, mas será que a funçãozinha é? Fiz ela em 15 segundos, pelo menos deu para mim me divertir. ;-) Se você for retirar zeros de alguma string que não seja numérica ela serve.
Depois dessa, nunca mais esqueço que aquele zerinho lá significa um octal. E prometo que da próxima vez seguro o post mais umas 6 horas até ter tempo de sentar e meditar sobre a provável solução mais otimizada pra coisa. ;-)
Comentários
Comentários fechados.
Artigos anteriores
- Pull requests em modo raiz - sex, 22 de dezembro de 2023, 09:57:09 -0300
- Qual a idade do seu repositório? - ter, 27 de dezembro de 2022, 12:50:35 -0300
- Utilizando ctags em projetos Rails mais recentes - qui, 24 de junho de 2021, 08:23:43 -0300
- Fazendo o seu projeto brotar - seg, 15 de julho de 2019, 08:57:05 -0300
- Learn Functional Programming with Elixir - sex, 02 de março de 2018, 18:47:13 -0300
- Ambiente mínimo - Driver Driven Development - qua, 23 de agosto de 2017, 15:15:03 -0300
- Ambiente mínimo - repositórios de código - dom, 16 de abril de 2017, 13:02:14 -0300
- Ambiente mínimo - terminal e navegador - dom, 02 de abril de 2017, 21:43:29 -0300
- Utilizando muitas gems no seu projeto? - sáb, 29 de outubro de 2016, 11:57:55 -0200
- Desenvolvedores e inteligência artificial - seg, 11 de julho de 2016, 09:09:38 -0300
A utilidade é não confundir algum número com outro somente por ele ter alguns zeros na frente. Vamos imaginar que você tenha que atualizar com Ajax alguma parte da página atual pegando 10 ordens de serviço começando pelo número que o usuário digitar, ou seja, você tem que pegar o número digitado e acrescentar 10. Se o usuário digitasse "0123", você fizesse um parseInt e acrescentasse 10, iria ficar com as ordens de 83 até 93 e não de 123 até 133. Tá, daria para passar 10 como limite na URL, mas dá para entender o exemplo né? :-)
Só para deixar claro, hoje, 3 anos depois desse post, ao invés de fazer essa barbaridade de função eu faço assim:
parseInt("0123".replace(/^0+/,'')) => 123
parseInt("000123".replace(/^0+/,'')) => 123
Vivendo e aprendendo. :-)
Rapá, nunca tinha ouvido falar nesta curiosidade/problema, mas, tem alguma utilidade prática?