Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
A validação de números decimais em JavaScript frequentemente vira um campo minado de armadilhas e soluções que parecem simples, mas geram inconsistências em ambientes reais. Muitas abordagens recorrem a parseFloat, isNaN ou a métodos de coerção de tipos, mas todas elas têm limitações sérias, especialmente quando o objetivo é garantir precisão, simplicidade e compatibilidade entre plataformas.
Nosso desafio é criar uma função que valide se uma string representa um número decimal válido, incluindo casos negativos, números com ponto decimal, notação científica, mas excluindo valores como hexadecimal, strings com caracteres inválidos ou números mal formatados.
Por exemplo, a validação deve retornar verdadeiro para: '-1', '0.42', '.5', '1e10', '-3.14'. e falso para: 'abc', '0xFF', '12.34.56', '1,000', ''.
Muitas soluções populares usam parseFloat ou parseInt, muitas vezes combinadas com isNaN. Essas funções, apesar de úteis, não são perfeitas: elas aceitam números em formatos não desejados, como '0x89f', ou retornam false para strings que representam números válidos em contextos específicos, como '.5'.
Outra tentativa comum envolve a coerção direta com a multiplicação por 1 ou a conversão por Number(), mas essas estratégias também não filtram adequadamente casos mal formatados ou hexadecimais. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
A melhor estratégia, na minha opinião, é usar uma regex bem estruturada para validar o formato do número. Uma expressão que cobre números negativos, decimais e notação científica, excluindo formatos inválidos, fica assim: Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
/^[+-]?((\d+\.?\d*)|(\.\d+))(e[+-]?\d+)?$/i
Essa regex garante que o valor começa opcionalmente com um sinal, seguido por um número inteiro, decimal ou apenas uma fração começando com ponto, e opcionalmente uma parte exponencial. Ela é robusta e fácil de entender, além de ser eficiente. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
function isValidNumber(str) {
const regex = /^[+-]?((\d+\.?\d*)|(\.\d+))(e[+-]?\d+)?$/i. return regex.test(str.trim()). }
Testando os casos:
Apesar de ser bem eficaz na maioria dos casos, essa regex não cobre números com separadores de milhar, como '1,000' — que geralmente é considerado inválido em validações de entrada simples. Para cenários mais complexos, seria necessário combinar a regex com validações adicionais ou usar bibliotecas específicas. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Outro ponto é que a regex pode parecer complexa no começo, mas sua leitura e manutenção são relativamente simples após algum tempo de prática. É uma solução que equilibra clareza e eficiência. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
1. Sempre limpar a entrada com trim() para evitar espaços
2. Usar uma regex bem estruturada, como a apresentada
3. Testar com um conjunto abrangente de casos de borda
4. Caso precise de maior rigor, complementar com validações específicas
Na prática, uma validação simples, clara e eficaz pode evitar muitos bugs de entrada, especialmente em formulários ou APIs que recebem dados numéricos. E vocês, já tiveram que lidar com validações de números que deram trabalho? Como resolveram? Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Carregando comentários...