【问题标题】:Validate octal number验证八进制数
【发布时间】:2014-10-07 08:36:59
【问题描述】:

这是验证字符串是否仅包含八进制数字的有效方法吗?

public static bool IsOctal(String toCheck)
{
    if (toCheck.Contains(" "))
    {
        return false;
    }
    int parsedtoCheck;
    var parseOk = int.TryParse(toCheck, out parsedtoCheck);
    if (!parseOk)
    {
        return false;
    }
    if (Convert.ToInt32(toCheck, 8) != parsedtoCheck)
    {
        return false;
    }
    return true;
}

【问题讨论】:

  • 根据this stack overflow question 看来您可能已经有了答案(并不是说我提倡抛出异常作为转换测试)
  • @jeffdot:永远不应该抛出期望,因为 toCheck 是 TryParse 之后的有效整数,还是我错过了什么?
  • 或许:try{Convert.ToInt32(toCheck, 8);return true;}catch{return false}
  • @benba:不,因为“9”会在int.TryParse 中成功,但在Convert.ToInt32(toCheck, 8) 中不会。而其他应该成功的值(例如“10”)将返回false,因为八进制10不等于十进制10...
  • @JonSkeet:我得到的第一点是,在文档中过度阅读了它们。但是第二个,Convert.ToInt32(10, 8) 返回一个 Int32 10 并且与另一个 10 相比它应该是相同的吗?我以为 C# 不知道八进制的任何表示?

标签: c# validation octal


【解决方案1】:

完全不清楚您当前的方法试图实现什么,因为它同时转换为十进制和八进制。如果您只想检查字符串是否仅包含数字 0-7,使用正则表达式可能最简单:

using System;
using System.Text.RegularExpressions;

class Test
{
    public static void Main(string[] args)
    {
        // Do you want this to be valid or not?
        Console.WriteLine(IsOctal(""));
        Console.WriteLine(IsOctal("012"));
        Console.WriteLine(IsOctal("890"));
        Console.WriteLine(IsOctal("abc"));
        // Do you want this to be valid or not?
        Console.WriteLine(IsOctal("-0123"));
    }

    private static bool IsOctal(string text)
    {
        return Regex.IsMatch(text, "^[0-7]+$");
    }
}

这假设:

  • 您只对非负值感兴趣(因此我们不需要接受前导 -
  • 不应认为空字符串有效
  • 之后您不需要实际的 - 只要您喜欢就可以了

【讨论】:

  • 我还以为你会采用 linq 方法。
  • @gunr2171:虽然这一直是我想到的一个选项,但在这种情况下,我认为它的可读性不如正则表达式。
  • 甚至是 "012".All(x => x>='0' && x
【解决方案2】:

如果性能很重要,您可能需要对正则表达式解决方案与扫描(改编自 this entry)进行基准测试:

private bool IsOctal(IEnumerable<char> chars)
{
    bool isOctal;
    foreach (var c in chars)
    {
        isOctal = (c >= '0' && c <= '7');

        if (!isOctal)
            return false;
    }
    return true;
}

正如之前的答案所指出的,这对您的数值做出了一些假设。

【讨论】:

    【解决方案3】:

    这在很大程度上取决于您的验证规则。八进制数的字符集没有一个真正的定义。有时从 0 开始是强制性的。在 Python 中,我相信您可以使用 _ 作为数字分隔符。负面的?科学/工程符号?小数?

    是的,其中一些很奇怪,但关键是,这取决于你在哪里使用它。

    您需要它在 C# 中可解析吗?然后 int.TryParse() 是要走的路。你只是解析它并获得成功或失败。它是否需要作为字符串传递给另一个服务/API?查找该服务/API 的验证规则。也不要像上面那样仔细检查,这只会混淆真正有效的字符集是什么,如果你不信任你的运行时,你不妨开始构建一个你信任的(不要做这,那是个玩笑)。

    找出真正的验证规则和要求是什么,你的答案就会很清楚。不要想太多。

    【讨论】:

      【解决方案4】:

      这是一个 linq 解决方案:

      public static void Main(string[] args)
      {
          var a = IsOctal("023"); //true
          var b = IsOctal("678"); //false
      }
      
      public static bool IsOctal(string text)
      {
          //get a collection of chars that each text element can be
          var possibleChars = Enumerable.Range(0, 8)
              .Select(x => x.ToString()[0]);
      
          //"are there any chars in 'text' that are not in 'possibleChar'?"
          var anyAreInvalid = text
              .Where(x => !possibleChars.Contains(x))
              .Any();
      
          //return the inverse of your question
          return !anyAreInvalid;
      }
      

      主要工作在Where 语句中,该语句根据“可接受的字符”列表检查输入中的每个字符。

      这也采用了来自 Jon's answer 的相同假设。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 2013-09-30
        • 2016-09-04
        相关资源
        最近更新 更多