gpt4 book ai didi

c# - 为什么 Char.IsDigit 为无法解析为 int 的字符返回 true?

转载 作者:太空狗 更新时间:2023-10-29 17:46:30 27 4
gpt4 key购买 nike

我经常使用Char.IsDigit检查 char 是否是一个数字,这在 LINQ 查询中特别方便,可以预先检查 int.Parse,如下所示:"123".All(Char. IsDigit).

但有些字符是数字,但不能像 5 那样解析为 int

// true
bool isDigit = Char.IsDigit('۵');

var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
int num;
// false
bool isIntForAnyCulture = cultures
.Any(c => int.TryParse('۵'.ToString(), NumberStyles.Any, c, out num));

这是为什么呢?我的 int.Parse - 通过 Char.IsDigit 进行的预检查因此不正确吗?

有310个字符是数字:

List<char> digitList = Enumerable.Range(0, UInt16.MaxValue)
.Select(i => Convert.ToChar(i))
.Where(c => Char.IsDigit(c))
.ToList();

这是 .NET 4 (ILSpy) 中 Char.IsDigit 的实现:

public static bool IsDigit(char c)
{
if (char.IsLatin1(c))
{
return c >= '0' && c <= '9';
}
return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber;
}

那么为什么有属于DecimalDigitNumber-category的字符呢? (“十进制数字字符,即 0 到 9 范围内的字符...”)在任何文化中都无法解析为 int

最佳答案

这是因为它正在检查 Unicode“数字,十进制数字”类别中的所有数字,如下所列:

http://www.fileformat.info/info/unicode/category/Nd/list.htm

这并不意味着它是当前语言环境中的有效数字字符。事实上,使用 int.Parse(),无论区域设置如何,您都只能解析普通的英文数字。

例如,这不起作用:

int test = int.Parse("٣", CultureInfo.GetCultureInfo("ar"));

即使 ٣ 是有效的阿拉伯数字字符,并且“ar”是阿拉伯语区域设置标识符。

Microsoft 文章 "How to: Parse Unicode Digits"指出:

The only Unicode digits that the .NET Framework parses as decimals are the ASCII digits 0 through 9, specified by the code values U+0030 through U+0039. The .NET Framework parses all other Unicode digits as characters.

但是请注意,您可以使用 char.GetNumericValue()将 unicode 数字字符转换为其等效的 double 字。

返回值是 double 而不是 int 的原因是这样的:

Console.WriteLine(char.GetNumericValue('¼')); // Prints 0.25

您可以使用类似这样的方法将字符串中的所有数字字符转换为它们的 ASCII 等效字符:

public string ConvertNumericChars(string input)
{
StringBuilder output = new StringBuilder();

foreach (char ch in input)
{
if (char.IsDigit(ch))
{
double value = char.GetNumericValue(ch);

if ((value >= 0) && (value <= 9) && (value == (int)value))
{
output.Append((char)('0'+(int)value));
continue;
}
}

output.Append(ch);
}

return output.ToString();
}

关于c# - 为什么 Char.IsDigit 为无法解析为 int 的字符返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22063436/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com