C# Programming

Identificando Números em Strings C# com Eficiência

Spread the love

Validar se uma string representa um número é uma tarefa frequente no desenvolvimento C#. Este artigo explora várias abordagens eficientes, comparando seus pontos fortes e fracos para ajudá-lo a escolher o melhor método para suas necessidades específicas.

Sumário

Usando Expressões Regulares (Regex.IsMatch())

Expressões regulares oferecem uma solução flexível e poderosa para validar padrões de string. O método Regex.IsMatch() permite que você defina um padrão para comparar com sua string de entrada. Esta abordagem é geralmente eficiente e lida com uma ampla gama de formatos de números.


using System;
using System.Text.RegularExpressions;

public class StringNumberValidator
{
    public static bool IsNumber(string str)
    {
        // Padrão para corresponder a inteiros, números de ponto flutuante (incluindo valores negativos)
        return Regex.IsMatch(str, @"^-?d+(.d+)?$"); 
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(IsNumber("123"));     // True
        Console.WriteLine(IsNumber("123.45"));  // True
        Console.WriteLine(IsNumber("-123"));    // True
        Console.WriteLine(IsNumber("-123.45")); // True
        Console.WriteLine(IsNumber("123a"));    // False
        Console.WriteLine(IsNumber(""));        // False
    }
}

Você pode ajustar a expressão regular para acomodar formatos de número específicos (por exemplo, apenas inteiros, números com um número limitado de casas decimais). Isso a torna altamente adaptável a vários requisitos.

Usando Métodos TryParse()

Os métodos TryParse() (por exemplo, int.TryParse(), double.TryParse(), decimal.TryParse()) tentam analisar a string em um tipo numérico. Eles retornam true se bem-sucedidos e false caso contrário. Esta é uma abordagem simples e muitas vezes eficiente, especialmente quando você conhece o tipo numérico esperado.


using System;

public class StringNumberValidator
{
    public static bool IsInteger(string str)
    {
        int number;
        return int.TryParse(str, out number);
    }

    public static bool IsDouble(string str)
    {
        double number;
        return double.TryParse(str, out number);
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(IsInteger("123"));     // True
        Console.WriteLine(IsDouble("123.45"));  // True
        Console.WriteLine(IsInteger("-123"));    // True
        Console.WriteLine(IsInteger("123a"));    // False
        Console.WriteLine(IsInteger(""));        // False
    }
}

Escolha o método TryParse() apropriado com base no tipo numérico esperado da sua string de entrada.

Usando LINQ (Enumerable.All())

O Enumerable.All() do LINQ fornece uma maneira concisa de verificar se todos os caracteres em uma string atendem a uma determinada condição. No entanto, esta abordagem é limitada a inteiros positivos sem pontos decimais ou sinais negativos.


using System;
using System.Linq;

public class StringNumberValidator
{
    public static bool IsPositiveInteger(string str)
    {
        return !string.IsNullOrEmpty(str) && str.All(char.IsDigit);
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(IsPositiveInteger("123"));   // True
        Console.WriteLine(IsPositiveInteger("123.45")); // False
        Console.WriteLine(IsPositiveInteger("-123"));  // False
        Console.WriteLine(IsPositiveInteger(""));      // False
    }
}

Este método é simples e eficiente para seu escopo limitado, mas carece da versatilidade de outras abordagens.

Verificação Manual Caractere a Caractere (Loop foreach)

Uma abordagem manual oferece o maior controle, mas geralmente é menos eficiente e mais propensa a erros. Você iteraria pela string, verificando cada caractere para garantir que seja um dígito, ponto decimal ou sinal de menos (se permitido) na posição correta.


using System;

public class StringNumberValidator
{
    public static bool IsNumberManual(string str)
    {
        if (string.IsNullOrEmpty(str)) return false;

        bool hasDecimal = false;
        bool hasSign = false;

        foreach (char c in str)
        {
            if (c == '-' && !hasSign && str.IndexOf(c) == 0)
            {
                hasSign = true;
                continue;
            }
            if (c == '.')
            {
                if (hasDecimal) return false;
                hasDecimal = true;
                continue;
            }
            if (!char.IsDigit(c)) return false;
        }
        return true;
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(IsNumberManual("123"));     // True
        Console.WriteLine(IsNumberManual("123.45"));  // True
        Console.WriteLine(IsNumberManual("-123"));    // True
        Console.WriteLine(IsNumberManual("-123.45")); // True
        Console.WriteLine(IsNumberManual("123a"));    // False
        Console.WriteLine(IsNumberManual(""));        // False
        Console.WriteLine(IsNumberManual("--123"));   //False
        Console.WriteLine(IsNumberManual("12.3.4"));  //False
    }
}

Embora isso forneça controle máximo, geralmente é recomendado usar os métodos mais concisos e eficientes discutidos anteriormente, a menos que você tenha requisitos de validação muito específicos.

Em resumo, a abordagem ideal depende de suas necessidades. Regex.IsMatch() oferece uma solução robusta e flexível para a maioria dos cenários, enquanto TryParse() é eficiente para validação simples de inteiros ou ponto flutuante. As abordagens LINQ e de loop manual são menos frequentemente preferidas devido às suas limitações.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *