为什么C#中没有String.IsNumeric函数

时间:2009-10-02 09:55:24

标签: c#

我很想知道为什么C#语言团队没有在String对象上提供IsNumeric函数? IsNumeric函数在Int32.TryParse函数的String对象上更合适。

注意:我问的是这个问题,因为我发现很难向初学者解释这个问题,我不喜欢他们为此诅咒C#!

更新:请问,这个问题不是关于如何实现IsNumeric函数。

6 个答案:

答案 0 :(得分:17)

像这样的方法的问题在于决定什么算作“数字”。如果它允许小数点,它是否应该允许前导空格,它是否应该有一个数字的上限?

Int32.TryParse回答了更明确定义的问题,“这是Int32的有效字符串表示吗?”

当然,没有什么可以阻止你编写自己的扩展方法,根据你自己的规则决定一个字符串是否为数字。

答案 1 :(得分:4)

因为可以找到很多有用且绝对需要的功能。

IsNumeric()
IsAlpha()
IsAlphaNumeric()
IsEmailAddress()
IsGuid()
...

等等。任何人都可以轻松添加他认为绝对需要的十几种方法。框架只是为了保持通用性,并为您提供基本工具来完成工作,并可能根据需要构建额外的工具。

也就是说,只需添加扩展方法。

答案 2 :(得分:3)

在您放入类的方法和其他类更好地执行的操作之间必须有一条线。

如果有IsNumeric方法,其他人可能会要求提供IsValidPhoneNumber,IsValidEmailAddress,IsValidURI甚至IsValidZipCodeInNewZealand方法......所有这些方法最好在他们自己的域中实现。

答案 3 :(得分:3)

我认为Int32.TryParse背后的逻辑是Int32类知道什么是有效的32位整数,而String类根本不知道什么是数字。

背后的原理是一个对象可以最好地检查自己是否可以将某些东西视为/转换为该特定对象。

答案 4 :(得分:1)

IIRC有Char.IsDigit(char c);

因此我认为应该有效:

string _temp = "12341234";
bool _isNumeric = _temp.ToCharArray().All(x => Char.IsDigit(x));

如果你愿意的话,你可以把它作为扩展方法包装。

答案 5 :(得分:0)

旁注:您可以随时实施自己的:

public static class StringExtensions
{
    public static Boolean IsNumeric(this String s)
    {
        // your own definition goes here
    }
}