验证八进制数



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

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

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

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]+$");
    }
}

假设:

  • 你只对非负值感兴趣(所以我们不需要接受一个领先的-)
  • 空字符串不应被视为有效
  • 你不需要实际的之后-它可以只要你喜欢

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

private bool IsOctal(IEnumerable<char> chars)
{
    bool isOctal;
    foreach (var c in chars)
    {
        isOctal = (c >= '0' && c <= '7');
        if (!isOctal)
            return false;
    }
    return true;
}

正如前面的回答所指出的,这对你的数值做了一些假设。

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

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

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

找出真正的验证规则和需求是什么,你的答案将是清晰的。别想太多了。

以下是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的回答中得到了相同的假设。

最新更新