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]+$");
}
}
这假定:
- 您只对非负值感兴趣(因此我们不需要接受前导的
)-
- 空字符串不应被视为有效
- 之后您不需要实际值-它可以是您喜欢的任何长度
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的验证规则。另外,不要像上面那样重复检查,这只是混淆了真正有效的字符集是什么,如果你不信任你的运行时,你最好开始构建一个你信任的运行时(不要这样做,那是个笑话)
找出真正的验证规则和要求是什么,你的答案就会很清楚。不要想得太多。这里有一个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:虽然我一直在考虑这个选项,但在这种情况下,我认为它的可读性不如正则表达式。甚至