C# Programming

C#字符串中高效识别数字

Spread the love

验证字符串是否表示数字是 C# 开发中常见的任务。本文探讨了几种高效的方法,比较它们的优缺点,以帮助您根据自身需求选择最佳方法。

目录

使用正则表达式 (Regex.IsMatch())

正则表达式为验证字符串模式提供了一种灵活且强大的解决方案。Regex.IsMatch() 方法允许您定义一个与输入字符串匹配的模式。这种方法通常效率很高,并且可以处理各种数字格式。


using System;
using System.Text.RegularExpressions;

public class StringNumberValidator
{
    public static bool IsNumber(string str)
    {
        // 匹配整数、浮点数(包括负数)的模式
        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
    }
}

您可以调整正则表达式以适应特定的数字格式(例如,只有整数,或小数位数有限的数字)。这使得它能够高度适应各种需求。

使用TryParse()方法

TryParse() 方法(例如,int.TryParse()double.TryParse()decimal.TryParse())尝试将字符串解析为数值类型。如果成功则返回true,否则返回false。这是一种直接且通常高效的方法,尤其是在您知道预期数值类型的情况下。


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
    }
}

根据输入字符串的预期数值类型选择合适的TryParse()方法。

使用 LINQ (Enumerable.All())

LINQ 的Enumerable.All()提供了一种简洁的方法来检查字符串中所有字符是否满足特定条件。但是,这种方法仅限于没有小数点或负号的正整数。


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
    }
}

此方法简单高效,但适用范围有限,缺乏其他方法的通用性。

手动逐字符检查 (foreach循环)

手动方法提供了最大的控制权,但通常效率较低,且更容易出错。您需要遍历字符串,检查每个字符以确保它是一个数字、小数点或减号(如果允许)并位于正确的位置。


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
    }
}

虽然这提供了最大的控制权,但除非您有非常具体的验证需求,否则通常建议使用前面讨论的更简洁高效的方法。

总之,最佳方法取决于您的需求。Regex.IsMatch()为大多数场景提供了一种强大而灵活的解决方案,而TryParse()对于简单的整数或浮点数验证则效率很高。由于 LINQ 和手动循环方法的局限性,它们的使用频率较低。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注