C# 验证八进制数

C# 验证八进制数,c#,validation,octal,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) { re

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

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,那么使用正则表达式可能是最简单的:

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]+$");
    }
}
这假定:

  • 您只对非负值感兴趣(因此我们不需要接受前导的
    -
  • 空字符串不应被视为有效
  • 之后您不需要实际值-它可以是您喜欢的任何长度

目前还不清楚您当前的方法试图实现什么,因为它同时转换为十进制和八进制。如果您只想检查字符串是否只包含数字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]+$");
    }
}
这假定:

  • 您只对非负值感兴趣(因此我们不需要接受前导的
    -
  • 空字符串不应被视为有效
  • 之后您不需要实际值-它可以是您喜欢的任何长度

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

是的,有些是奇怪的,但问题是,这取决于你在哪里使用它

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


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

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

是的,有些是奇怪的,但问题是,这取决于你在哪里使用它

您是否需要它在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
语句中,该语句根据“可接受字符”列表检查输入中的每个字符


这也采用了相同的假设。

以下是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
语句中,该语句根据“可接受字符”列表检查输入中的每个字符


这也采用了相同的假设。

如果性能很重要,您可能希望对正则表达式解决方案与扫描(改编自):

private bool isotal(IEnumerable chars)
{
布尔等塔尔;
foreach(以字符表示的变量c)
{

isOctal=(c>='0'&&c如果性能很重要,您可能希望对正则表达式解决方案与扫描进行基准测试(改编自):

private bool isotal(IEnumerable chars)
{
布尔等塔尔;
foreach(以字符表示的变量c)
{

isOctal=(c>='0'&&c根据它,看起来您可能已经有了答案(我并不主张将抛出异常作为转换测试)@jeffdot:不应该抛出期望值,因为toCheck是TryParse之后的有效整数,或者我遗漏了什么吗?也许:
尝试{Convert.ToInt32(toCheck,8);return true;}catch{return false}
@benba:No,因为“9”将在
int.TryParse
中成功,但不会在
Convert.ToInt32(toCheck,8)
和其他值(例如“10”)中成功哪个应该成功将返回
false
,因为八进制10不等于十进制10…@JonSkeet:我得到的第一点在文档中读得太多了。但是第二点,Convert.ToInt32(10,8)返回一个Int32 10,与另一个10相比应该是相同的?我认为C#不知道八进制的任何表示法?根据它,看起来您可能已经有了答案(不是说我主张抛出异常作为转换测试)@jeffdot:不应该抛出期望值,因为toCheck是TryParse之后的有效整数,或者我遗漏了什么吗?也许:
尝试{Convert.ToInt32(toCheck,8);return true;}catch{return false}
@benba:No,因为“9”将在
int.TryParse
中成功,但在
Convert.ToInt32(toCheck,8)中不会成功
。其他应该成功的值(例如“10”)将返回
false
,因为八进制10不等于十进制10…@JonSkeet:我得到的第一个点在文档中读得太多。但是第二个点,Convert.ToInt32(10,8)返回一个Int32 10,与另一个10相比,它应该是相同的?我以为C#不知道八进制的任何表示法?我还以为你会使用linq方法。@gunr2171:虽然我一直在考虑这个选项,但在这种情况下,我认为它的可读性不如正则表达式,甚至“012”。所有(x=>x>='0'&&x,我原以为您会使用linq方法。@gunr2171:虽然我一直在考虑这个选项,但在这种情况下,我认为它的可读性不如正则表达式。甚至