验证八进制数

时间:2014-08-13 20:21:52

标签: c# validation octal

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

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;
}

4 个答案:

答案 0 :(得分:2)

它一点也不清楚你当前的方法试图实现什么,因为它以十进制和八进制进行转换。如果你只想检查字符串是否只包含数字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]+$");
    }
}

这假定:

  • 您只对非负值感兴趣(因此我们不需要接受领先的-
  • 空字符串不应视为有效
  • 之后您不需要实际的 - 只要您愿意,就可以

答案 1 :(得分:1)

如果性能很重要,您可能需要对正则表达式解决方案与扫描(改编自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;
}

正如早先的答案所指出的,这会对你的数值做出一些假设。

答案 2 :(得分:0)

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

是的,其中一些是奇怪的,但关键是,这取决于你使用它的位置。

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

了解真正的验证规则和要求是什么,您的答案将是明确的。不要过度思考它。

答案 3 :(得分:0)

这是一个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采用相同的假设。