文字が数字かどうかを判別する

C++には、ある文字が数字であるかどうかを判別するための専用の関数があります。文字の型がナロー文字であるかワイド文字であるか(あるいは他の文字様値であるか)によって、さらにはロケールをどう扱うかによっていくつかの関数を使い分ける必要があります。

isdigit 関数

isdigit 関数は最もシンプルな判別関数です。ほとんどの場合はこの関数を使えば事足りるでしょう。下記のサンプルでは、標準入力から1文字読み込んだあと、それが数字であれば "数字" という文字列を標準出力に書き出しています。注意すべきなのは、isdigit 関数に渡す実引数の値は 0~UCHAR_MAX の範囲でなければならない点です。下記のサンプルでは、unsigned char 型にキャストすることで解決しています。

#include <iostream>
#include <cctype>
 
int main()
{
  char c;
  std::cin >> c;
  if (std::isdigit(static_cast<unsigned char>(c)))
  {
    std::cout << "数字" << std::endl;
  }
}

iswdigit 関数

iswdigit 関数は isdigit 関数のワイド文字版です。下記のサンプルは、isdigit 関数のサンプルをそのまま iswdigit 関数用に書き換えたものです。引数のキャストが必要ないため、見た目は isdigit 関数のサンプルよりすっきりしています。

#include <iostream>
#include <cwctype>
 
int main()
{
  wchar_t wc;
  std::wcin >> wc;
  if (std::iswdigit(wc))
  {
    std::cout << "数字" << std::endl;
  }
}

なお、標準準拠度の低い処理系では std::wcin が使えない場合がありますが、ここでの議論の本質ではありません。

isdigit 関数テンプレート

最後は、最も汎用性が高い isdigit 関数テンプレートです。この選択は、汎用性は高くなりますが、比較的重い処理になりますので、パフォーマンスが要求される場合には不向きです。

#include <iostream>
#include <locale>
 
int main()
{
  char c;
  std::cin >> c;
  std::locale loc;
  if (std::isdigit<char>(c, loc))
  {
    std::cout << "数字" << std::endl;
  }
}

isdigit 関数テンプレートを使うには、明示的に文字型をテンプレート引数として指定しなければなりません。また、第2引数としてロケールを指定する必要があります。