这是验证字符串是否只包含八进制数的有效方法吗?
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 :(得分: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采用相同的假设。