在编译时查询字符是否为数字

Query whether a char is a digit at compile time

本文关键字:是否 数字 字符 查询 编译      更新时间:2023-10-16

我想在编译时检查给定的字符是否是数字。特别是我需要实现以下函数原型:

template<char c>
constexpr bool IsDigit();

澄清一下:我不必使用自定义实现。如果std中已经有内置方法,我更喜欢这种方法。

这应该适用于 ASCII:

constexpr bool IsDigit(char c) { return c >= '0' && c <= '9'; }  // ASCII only

如果您需要保留原型:

template<char C>
constexpr bool IsDigit() { return C >= '0' && C <= '9'; }  // ASCII only

为了获得wchar_t支持,您可以尝试以下方法:

constexpr bool IsDigit(wchar_t c)
{
  return (c >= L'0' && c <= L'9') ||
         (c >= L'u0660' && c <= L'u0669') ||  // Arabic-Indic
         (c >= L'u06F0' && c <= L'u06F9') ||  // Extended Arabic-Indic
         (c >= L'u07C0' && c <= L'u07C9') ||  // NKO
         (c >= L'u0966' && c <= L'u096F') ||  // Devanagari
         (c >= L'u09E6' && c <= L'u09EF') ||  // Bengali
         (c >= L'u0A66' && c <= L'u0A6F') ||  // Gurmukhi
         (c >= L'u0AE6' && c <= L'u0AEF') ||  // Gujarati
         (c >= L'u0B66' && c <= L'u0B6F') ||  // Oriya
         (c >= L'u0BE6' && c <= L'u0BEF') ||  // Tamil
         (c >= L'u0C66' && c <= L'u0C6F') ||  // Telugu
         (c >= L'u0CE6' && c <= L'u0CEF') ||  // Kannada
         (c >= L'u0D66' && c <= L'u0D6F') ||  // Malayalam
         (c >= L'u0E50' && c <= L'u0E59') ||  // Thai
         (c >= L'u0ED0' && c <= L'u0ED9') ||  // Lao
         (c >= L'u0F20' && c <= L'u0F29');    // Tibetan
  // Missing check for Myanmar, Khmer, Mongolian, Limbu, New Tai Lue,
  // Tai Tham Hora, Tai Tham Tham, Balinese, Sundanese, Lepcha, Ol Chiki,
  // Vai, Surashtra, Kayah, Javanese, Cham, Meetei Mayek, Osmanya, Brahmi,
  // Sora, Chakma, Sharada, Takri, Mathematical.
  // For codes see http://www.unicode.org/ucd/
}