C#-验证字符串是否是除int.TryParse()之外的数字的更好方法

本文关键字:数字 方法 更好 字符串 验证 是否是 TryParse int C#- | 更新日期: 2023-09-27 18:29:35

我发现自己经常需要使用int.TryParse()来测试一个值是否是整数。然而,当使用TryParse时,我必须向函数传递一个引用变量。所以我发现自己总是需要创建一个临时int来传递

int my_temp_integer;

int.TryParse(potential_integer, my_temp_integer);

考虑到我只想要一个简单的真/假响应,而且我不在乎实际解析的结果,我觉得这很麻烦。有没有更好的方法来解决这个问题?为什么没有一个重载函数,我可以直接传递我想要测试的值,并得到一个真/假响应?

谢谢。

C#-验证字符串是否是除int.TryParse()之外的数字的更好方法

您可以编写一个扩展方法:

public static bool IsInt(this string pString)
{
   int value;
   return int.TryParse(pString, out value);
}

然后你的例子变成:

potential_integer.IsInt();

编辑:最近我一直在使用这种通用形式。

public delegate bool TryParser<T>(string pString, out T pResult);
public static bool Is<T>(this string pString, TryParser<T> pTryParser)
{
   T val;
   return pTryParser(pString, out val);
}

然后可以按如下方式使用它;它并不完美,但比我发现的任何东西都要简洁:

"1234".Is<int>(int.TryParse);       // true
"asdf123".Is<int>(int.TryParse);    // false
"1.2345".Is<float>(float.TryParse); // true
"1000".Is<byte>(byte.TryParse);     // false

从理论上讲,只要遵循与官方方法相同的模式,这也适用于自定义TryParse方法。

更新:如果按类型维护TryParse方法的静态字典,则可以避免直接传递该方法。字典甚至可以根据需要使用反射进行填充。

一个简单的解决方案是创建一个扩展方法。

public static class StringExtensions {
    public static bool IsInt(this string s) {
        int i;  return Int.TryParse(s, out i);
    }
}

然后你就这样使用它:

 string s = "123";
 if (s.IsInt())
     // do something.

如果你不想真正转换字符串,只需要测试它,那么你可以使用Regex

有点像这样(你可能需要调整以适应你的需求):

public bool IsInt(this string inputData)
{
    Regex isNumber = new Regex(@"^'d+$");
    Match m = isNumber.Match(inputData);
    return m.Success;
}

您可以使用

bool isInt = str.TrimEnd( new char[]  {'0','1','2','3','4','5','6','7','8','9'})
                .Length == 0;

上面Muad'Dib的一个较短的替代方案:

bool IsInt(string input)
{
    return new System.Text.RegularExpressions.Regex(@"^'d$").IsMatch(input);
}

/Hans