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

时间:2011-04-07 16:32:24

标签: c# .net

我只需知道值是否为数字。我不需要对价值做任何事情。这是最好的方法吗?感觉很脏,创建一个我将永远不会使用的变量:

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

8 个答案:

答案 0 :(得分:3)

是的,使用相关的TryParse方法并忽略out参数是执行此操作的最佳方式。

您可能希望将其包装到您自己的一组辅助方法中(如果默认值不合适,可以指定相应的文化等),只返回bool而不是{{1} }}参数使它们更容易调用。

当然,您需要确定哪种解析最合适 - 即使对于整数,您还需要考虑out的范围是否足以满足您的用例。根据我的经验,大多数数字输入都有自己的“自然”有效值范围,这不太可能完全是任何预定义类型的范围。因此,您可能希望扩展辅助方法以包括要接受的有效值范围。

答案 1 :(得分:2)

它不如int.TryParse灵活,但您可以查看每个字符是否为数字:

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

但总的来说,我建议坚持使用int.TryParse。您甚至可以调用未使用的参数“忽略”来明确您的意图,例如:

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

答案 2 :(得分:1)

这是我所知道的最好的方式 - 这是我们公司标准所坚持的,因为在解析过程中完成了错误处理。

详细介绍了优势:http://www.dotnetperls.com/int-tryparse

答案 3 :(得分:1)

这是在C#中使用它的推荐方法。但是,您也可以添加Microsoft.VisualBasic.dll作为项目的参考,然后使用Microsoft.VisualBasic.Information.IsNumeric()

答案 4 :(得分:1)

您可以使用正则表达式

Regex _isNumber = new Regex(@"^\d+$");
_isNumber.IsMatch(txtFoo.Text);

这只会匹配Ints,但您可以编写一个也匹配小数。

答案 5 :(得分:1)

“是数字”是一个含糊不清的术语。

  • 文化意识?
  • 允许千位和/或小数分隔符?
  • 允许科学记数法?
  • 允许一个标志(之前?之后?......)
  • 您允许的价值范围是多少?有符号32位整数(Int32.TryParse),无符号32位整数(UInt32.TryParse),十进制,双精度......

因此,没有“最佳”方式,框架提供了多种不同的方法来解析数字。

答案 6 :(得分:0)

您可以尝试使用Regex解析来确定字符串中没有非数字字符,或者您可以根据输入使用Int.TryParse(),Double.TryParse(),Float.TryParse()。 / p>

答案 7 :(得分: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会被注意为一个数字,需要更多的魔法才能进行干净的检查,但是你可以确定它是一个int还是一个浮点数。