C#中的Char.IsHex()

继这个问题之后,在C#中编写Char.IsHex()函数的最佳方法是什么。 到目前为止我有这个,但不喜欢它:

bool CharIsHex(char c) { c = Char.ToLower(c); return (Char.IsDigit(c) || c == 'a' || c == 'b' || c == 'c' || c == 'd' || c == 'e' || c == 'f') } 

从我对您链接的问题的回答 :

 bool is_hex_char = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); 

您可以将其编写为扩展方法:

 public static class Extensions { public static bool IsHex(this char c) { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); } } 

这意味着您可以将其称为char的成员。

 char c = 'A'; if (c.IsHex()) { Console.WriteLine("We have a hex char."); } 

请注意, Char.IsDigit()为更多代码点返回true ,而不仅仅是ASCII范围0x30到0x39中的数字。

例如,从Char.IsDigit()返回true的泰语数字字符:’0”1”2”3”4”5”6”7”8”9′

此外, Char.IsDigit()返回的“全宽”字符为: 0xff100xff19 。 这些字形看起来就像ASCII字符0x30-0x39 ,所以如果你要接受它们,你也应该接受看起来像’A’ – ‘F’和’a’ – ‘的0xff21-0xff260xff41-0xff46 F’。

如果您要支持ASCII范围之外的数字,您的用户可能希望您支持与其他地方存在的拉丁语’a’…’f’和’A’…’F’对应的字形ASCII范围之外的脚本。

就个人而言,我认为我会更喜欢以下内容:

  bool isHexChar = ('0' <= c) && (c <= '9') || ('a' <= c) && (c <= 'f') || ('A' <= c) && (c <= 'F'); 

我认为这对人们来说可能不那么令人惊讶。

只需使用.NET方法:

 char c = 'a'; System.Uri.IsHexDigit(c); 

使用字符串比较还有一种方法可以做到这一点。

 bool IsHex(char c) { return "0123456789ABCDEFabcdef".IndexOf(c) != -1; } 

关于什么

 bool CharIsHex(char c) { c = Char.ToLower(c); return Char.IsDigit(c) || (c >= 'a' && c <= 'f'); } 

您可以在扩展函数中使用正则表达式:

 using System.Text.RegularExpressions; public static class Extensions { public static bool IsHex(this char c) { return (new Regex("[A-Fa-f0-9]").IsMatch(c.ToString())); } }