至于您的问题(是否有解析 C# 整数文字的标准函数) - 答案是否定的。
我不确定他们将如何返回他们将被解析的值。我带了一个相当长的元组:
(bool succeeded, Type theType, int i, uint iU, long iL, ulong iUL)
这样,您将获得解析是否成功的指示(int.TryParse),以及成功解析的类型以及获取值的方法(无论是什么类型)。
在那之后,我只是蛮力,使用正则表达式来解析输入字符串的各个部分。顺便说一句,我很确定-234 和+678 都是有效的整数文字;所以我也照看标志。
我从正则表达式模式和正则表达式开始:
private const string literalPattern = @"(?<prefix>[+-]?)(?<number>[0-9]+)(?<suffix>(ul|lu|u|l)?)";
private static Regex literalRegex = new Regex(literalPattern, RegexOptions.IgnoreCase);
(?<name>pattern) 模式允许命名组。您可以看到我在以下表达式中使用它们:match.Groups["prefix"].ToString()。
然后我有我的蛮力解析代码:
public static (bool, Type, int, uint, long, ulong) ParseIntegerLiteral(string theLiteral)
{
(bool, Type, int, uint, long, ulong) badReturn = (false, null, 0, 0, 0, 0);
var match = literalRegex.Match(theLiteral);
if (match.Groups.Count == 0)
{
return badReturn;
}
var negativeMult = 1;
if (string.Equals(match.Groups["prefix"].ToString(), "-", StringComparison.OrdinalIgnoreCase))
{
negativeMult = -1;
}
Type type;
var i = 0;
var iu = 0U;
var il = 0L;
var iul = 0UL;
switch (match.Groups["suffix"].ToString().ToUpper())
{
case "L":
type = typeof(long);
if (!long.TryParse(match.Groups["number"].ToString(), out il))
{
return badReturn;
}
break;
case "U":
type = typeof(uint);
if (negativeMult == -1)
{
return badReturn;
}
if (!uint.TryParse(match.Groups["number"].ToString(), out iu))
{
return badReturn;
}
iul = iu;
break;
case "UL":
case "LU":
type = typeof(ulong);
if (negativeMult == -1)
{
return badReturn;
}
if (!ulong.TryParse(match.Groups["number"].ToString(), out iul))
{
return badReturn;
}
break;
default:
type = typeof(int);
if (!int.TryParse(match.Groups["number"].ToString(), out i))
{
return badReturn;
}
i *= negativeMult;
il = i;
if (i >= 0)
{
iu = (uint)i;
iul = (ulong)i;
}
break;
}
return (true, type, i, iu, il, iul);
}
与往常一样,代码的测试非常简单。您需要为它编写一些单元测试。