【问题标题】:Why is there no String.IsNumeric Function in C#为什么 C# 中没有 String.IsNumeric 函数
【发布时间】:2009-10-02 18:16:22
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以将其添加为扩展方法。 :)
  • 我知道扩展方法,但这不是这里的问题,但无论如何谢谢 (-:

标签: c#


【解决方案1】:

这样的方法的麻烦在于确定什么是“数字”。是否应该允许小数点,是否允许前导空格,是否应该有位数的上限?

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

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

【讨论】:

  • 这并没有阻止 MS 将这些方法用于 Char 数据类型。
  • 这是因为单个字符要么是数字字符要么不是数字字符,所以这样的方法是有意义的
【解决方案2】:

因为可能有很多功能可以让人觉得有用且绝对需要。

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

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

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

【讨论】:

  • 我觉得 IsNumeric 函数是我们从小就在其他语言中使用的东西。而且我觉得这是绝对必要的,除非您希望我成为对其他对象的替代功能有深入了解的专家!
【解决方案3】:

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

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

【讨论】:

  • @Timbo 如果您查看 Internet 上其他地方有关 IsNumeric 函数的问题数量,您就会明白我为什么问这个问题。这是大多数开发人员希望在 String 对象中看到的一种常见功能。对于那些来自其他语言/工具(如 VB6)的人,希望它可以在 String 对象中使用!
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    IIRC 有 Char.IsDigit(char c);

    因此我认为这应该可行:

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

    如果你愿意,你可以把它包装成一个扩展方法。

    【讨论】:

    • 很遗憾,这不适用于负数或任何更复杂的数字格式,具体取决于当前用户的本地化设置。
    • 如果您只允许自然数而没有前导或尾随空格,那么您的表达式是有意义的。所以这一切都取决于你对“数字”的定义。
    【解决方案6】:

    附带说明:您始终可以实现自己的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多