【问题标题】:Is there an Int.isWholeNumber() function or something similar?是否有 Int.isWholeNumber() 函数或类似的函数?
【发布时间】:2011-08-20 03:59:58
【问题描述】:

我需要检查输入是否为 int。有没有类似 String.IsNullOrEmpty() 的函数,比如 Int.isWholeNumber() 函数?

有没有办法只在if() 语句中验证这一点,而不必在之前声明一个int? (正如您需要对 TryParse() 所做的那样)

编辑
我需要验证区号(五个数字)

【问题讨论】:

  • 整数是什么意思?非负数?
  • 之前声明int有什么问题?当然,您可以编写正则表达式来验证仅数字的输入,但我认为它会比 int.TryParse 更昂贵。
  • Wikipedia(en.wikipedia.org/wiki/Whole_number) 说整数这个词有点模棱两可。这对你意味着什么?
  • @Aliostad 一个“整数”是一个整数,老实说是一个小学术语。
  • @Ben 这个词的意思并不是每个人都一致。

标签: c# int validation


【解决方案1】:

我从您的 cmets 得知您的实际问题是“我如何确定此字符串是否包含有效的瑞典邮政编码?”瑞典邮政编码是一个不以零开头的五位数字。如果这是您实际必须解决的问题,那么解决该问题。我不会尝试将字符串转换为整数然后检查整数,而是简单地编写检查:

  • 字符串是否有五个字符长?如果没有,请拒绝。
  • 是字符串 1、2、3、4、5、6、7、8 还是 9 的第一个字符?如果没有,请拒绝。
  • 是字符串 0、1、2、3、4、5、6、7、8 还是 9 的第二个、第三个、第四个和第五个字符?如果没有,请拒绝。

就这么简单。如果您永远不会对其进行数学运算,请不要首先将其转换为整数。

这种方法将进一步推广到更复杂的形式。据我所知,瑞典邮政编码通常以“SE-12 345”的形式书写,即前缀为“SE-”,数字二和三之间有一个空格。编写处理该格式的整数验证例程将非常困难,但编写字符串验证例程很简单。

更一般地说,这说明了一些编写问题的好建议。 就您实际必须解决的问题提出问题。您假设了一个解决方案——将字符串解析为一个整数——然后开始询问有关您假设的解决方案的问题。这会自动阻止任何人提供针对您的实际问题的建议。也许读到这篇文章的人已经开发了一个邮政编码验证软件库;如果他们有,他们永远不会知道从你原来的问题中告诉你。

【讨论】:

  • 我怎么说这话才不会显得聪明呢?我的问题源于验证区号,但我的实际问题与它无关。我只是想知道如何在一行代码中验证一个 int。 DB 只需要长度为 5 的 int(我没有设计它,也不倾向于重新设计它)。约翰的回答准确而中肯。并不是说我不欣赏你的回答和你的努力!
【解决方案2】:

我不相信 BCL 中有任何这样的方法,但编写一个很容易(我假设您真的在谈论是否可以将字符串解析为整数):

public static bool CanParse(string text)
{
    int ignored;
    return int.TryParse(text, out ignored);
}

根据需要添加接受IFormatProvider 值等的重载。假设这是为了验证,您可能希望扩展它以允许指定一系列有效值...

如果您要进行大量自定义验证,您可能希望查看Fluent Validation 项目。

【讨论】:

  • 名人访问。我想不要将此标记为解决方案可能会让我遇到 SO =)
【解决方案3】:

您可以通过扩展方法来实现:

你使用

bool isNumber = "-1990".IsNumber();

代码如下:

public static class NumberStringExtension
{

    public static bool IsNumber(this string value)
    {
        int i = 0;
        return int.TryParse(value, out i));
    }

}

【讨论】:

  • 请注意,您可以将声明后的所有内容写为:return int.TryParse(value, out i) && i >= 0;。您是否认为它比较长形式更具可读性是个人喜好:)
  • 我对扩展方法很着迷,我无法抗拒:)
  • 扩展方法有效,但为什么你会有 "WholeNumberString" 的 "IsNonNegative" 扩展?
  • @JMc 我更改了代码。结果发现 OP 对数字感兴趣,而不是我想的非负数。
【解决方案4】:

查看 int.TryParse 是否给您答案,并确保输入字符串中没有小数点。 (如果有人输入“1.”作为输入,这会给你一个误报。)

string input;
int ignored;

bool wholeNumber = int.TryParse(input, out ignored) && input.indexOf('.') == -1;

【讨论】:

    【解决方案5】:

    使用Int.TryParse 或者自定义函数。

    function bool IsNumber(object number)
    {
      try
      {
        Convert.ToInt32(number.ToString());
        return true;
      }
      catch
      {
       return false;
      }
    }
    

    【讨论】:

    • 如果你要在文本不是数字的情况下抛出异常,你还不如直接调用int.Parse 开始......(我也认为你错过了一点OP 说“不必在之前声明 int”的问题。)
    【解决方案6】:

    根据定义,int 类型必须是整数。它必须是 double、float 或 decimal 类型才能成为非整数。您可以随时尝试测试输入的类型。

    或者输入是一个字符串?如果输入是字符串,您可以尝试搜索“。”或 ',' 字符(取决于文化)。或者您可以尝试解析为整数。

    【讨论】:

      【解决方案7】:

      因为每个 int 都是一个整数,所以这很简单:

      public static bool IsWholeNumber(int i)
      {
          return true;
      }
      

      【讨论】:

      • 这是我见过的最糟糕的功能。这甚至没有接近他想做的事情。
      【解决方案8】:

      如果你只想在 if 语句中验证它,你可以这样做

      If ( val % 1 > 0)
        //not whole number
      

      【讨论】:

      • 这并没有回答用户的问题。这并不能确保用户输入的值是偶数。
      • @Ramhound The used 从未真正说明它是什么类型的输入。我的假设是输入是数字类型。如果输入是数字类型,这实际上会按要求工作。
      猜你喜欢
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 2013-05-03
      • 2011-08-01
      • 2014-06-14
      相关资源
      最近更新 更多