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);
考虑到我只想要一个简单的真/假响应,而且我不在乎实际解析的结果,我觉得这很麻烦。有没有更好的方法来解决这个问题?为什么没有一个重载函数,我可以直接传递我想要测试的值,并得到一个真/假响应?
谢谢。
您可以编写一个扩展方法:
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