Blog do TaQ

Javascript stuff

Publicado em Developer

Uma coisa bestinha mas que tem uma importancia tremenda me foi relembrada hoje: o parseInt do JavaScript parece que fica doidão se você tem alguns zeros à esquerda da sua String. Por exemplo, testem esse código:

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. ;-)
Tags:


Comentários

comments powered by Disqus

Twitter