在C#中测试一个值是否为数字的正确方法

6

我只需要知道这个值是否为数字,不需要对这个值进行任何操作。这是最好的方法吗?创建一个我永远不会使用的变量让我感觉很不舒服。

int val;
if(int.TryParse(txtFoo.Text, out val))
{
    ....
}

1
123.45 是数值型的,但是它会失败这个检查。您只测试整数吗? - Winston Smith
如果我没记错的话,有一个char.IsNumeric函数。 - user492238
@Winston Smith - 这与本问题无关,因为123.45永远不适用于int。如果是这种情况,他们会使用float并执行float.TryParse。 - Chris Dixon
@thedixon - 这就是我的观点。 - Winston Smith
8个回答

3
是的,使用相关的TryParse方法并忽略out参数是最好的方法。
您可能希望将此包装到您自己的helper方法中(如果默认值不适合您,可以指定适当的区域设置等),并只返回一个没有out参数的bool,以使调用更容易。
当然,您需要确定哪种解析方法最合适 - 即使对于整数,您也需要考虑Int32的范围是否足够满足您的用例。 在我的经验中,大多数数字输入都有其自己的“自然”有效值范围,这不太可能恰好是任何预定义类型的范围。 因此,您可能希望扩展您的helper方法以包括接受的有效值范围。

如果Int32不够大,并且他使用的是.Net 4,他可以使用System.Numerics.BigInteger.TryParse() - Chris Wenham
1
@C. Lawrence Wenham:不要忘记可怜、被忽视的 Int64 - LukeH
2
@LukeH:是的,但 BigInteger “可以到11”。 - Chris Wenham
2
@C. Lawrence Wenham:太棒了。如果有一种语言,普通整数类型只能处理[-10, 10],但BigInteger可以到11,那不是很好吗? - Jon Skeet

3
"是数字"这个词是一个模糊的术语。
  • 是否支持区分文化差异?
  • 是否允许使用千位分隔符和/或小数点?
  • 是否允许使用科学计数法?
  • 是否允许添加符号(在前面?在后面?...)
  • 您允许哪些范围的值?有符号32位整数(Int32.TryParse),无符号32位整数(UInt32.TryParse),十进制,双精度浮点数等。
因此,并没有一种“最佳”方法,框架提供了多种不同的方法来解析数字。

2

它不像int.TryParse那样灵活,但您可以检查每个字符是否为数字:

bool isInt = txtFoo.Text.All(c => char.IsNumber(c));

总的来说,我建议使用 int.TryParse。你甚至可以将未使用的参数命名为 "ignored",以明确你的意图,例如:

int ignored;
bool isInt = int.TryParse(txtFoo.Text, out ignored);

你需要添加对 '+''-',.'E''e' 的处理,也许还有其他我忽略的字符,因为这些是可能出现在数字字符串中的非数字字符。 - phoog
@phoog:完全同意,这就是为什么我最终建议使用'int.TryParse'。我只是提供了一种在更受限制的条件下看待问题的替代方法。 - Chris Schmich

2
您可以使用正则表达式。
Regex _isNumber = new Regex(@"^\d+$");
_isNumber.IsMatch(txtFoo.Text);

这只匹配整数,但是你可以编写一个同时匹配小数的方法。


1

这是使用C#的推荐方式。然而,你也可以将Microsoft.VisualBasic.dll添加为项目的引用,然后使用Microsoft.VisualBasic.Information.IsNumeric()


0
bool test (string teststring) 
 { for (i=0;i==teststring.length;i++){
   if instr("0123456789.,-+Ee",teststring.substring(i,1) <0){return false;}
   // some additional tests below here if you like
   return true;
 }

然而,E1001E12e.12e会被标记为一个数字,需要一些更神奇的操作来进行清洗检查,但是你也许能够确定它是整数还是浮点数。


0

通过 Wayback Machine 更新了链接;原始的 TryParse 已经不存在了。 - IAbstract

0
你可以尝试使用正则表达式解析来确定字符串中没有非数字字符,或者根据输入使用Int.TryParse()、Double.TryParse()、Float.TryParse()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接