В чем разница между isdigit () и isnumber ()?

У меня есть функция isnumber () в моем ctype.h. Я не нахожу ссылки на эту функцию в книгах, которых у меня нет ни в http://www.cplusplus.com/reference/cctype/ для консультации.
Я намерен обнаружить и показать разницу между isdigit () и isnumber () на простом примере, но это не так (кроме того, U + 0C6A, U + 0ED2 и ½ не обнаруживаются функциями).
Есть ли разница? Как я могу решить это?

int main(int, char *[])
{
string text("Hello½123, Poly౪ ໒girl0.5!!!");
decltype(text.size()) punct = 0, alpha = 0, number = 0, space = 0, digit = 0, graf = 0;
for(auto i : text) {
if(ispunct(i)){
cout << i << "<punct  ";
++punct;
}
if(isalpha(i)) {
cout << i << "<alpha  ";
++alpha;
}
if(isnumber(i)) {
cout << i << "<number  ";
++number;
}
if(isdigit(i)) {
cout << i << "<digit  ";
++digit;
}
if(isgraph(i)) {
cout << i << "<graph  ";
++graf;
}
if(isspace(i))
++space;
}
cout << endl << "There is " << endl;
cout << punct <<  " puncts," << endl;
cout << alpha << " alphas," << endl;
cout << number << " numbers," << endl;
cout << digit << " digits," << endl;
cout << graf << " graphs," << endl;
cout << space << " spaces" << endl;
cout << "in " << text << endl;

return 0;
}

Часть результата:

...

5 numbers,
5 digits,
23 graphs,
2 spaces
in Hello½123, Poly౪ ໒girl0.5!!!

1

Решение

isnumber() может быть специфичным для Apple методом C ++ (у меня нет Mac для проверки).
Вы можете увидеть это в Apple Dev Guide:

isnumber() функция ведет себя аналогично isdigit(), но может распознавать дополнительные символы в зависимости от текущей настройки локали.


Кроме того, isnumber() не объявлено в Linux:
Я использую g ++ 6.1.1 в Linux 4.7.2 и получаю ошибку:

g++ a.cpp
a.cpp: In function 'int main(int, char**)':
a.cpp:20:17: error: 'isnumber' was not declared in this scope
if (isnumber(i)) {
^

Я также использую clang3.8.1 для проверки:

clang++ a.cpp --std=c++11
a.cpp:20:7: error: use of undeclared identifier 'isnumber'
if (isnumber(i)) {
^
5

Другие решения

isdigit() работает только с 0-9.

isnumber() позволяет другие числовые значения, такие как дроби. Некоторые символы, которые являются «числовыми», но не являются цифрами, включают в себя 0x00b2 и 0x00b3, которые обозначены надписями 2 и 3 («²» и «³») и глифы, являющиеся дробными частями, такими как «¼», «½» и «¾».

3

isnumber() Функция была добавлена ​​Apple, поэтому вам нужно использовать документацию Apple.

Вот цитата из ctype.h man-страница для iOS:

STANDARDS
These functions, except for digittoint(), isascii(), ishexnumber(),
isideogram(), isnumber(), isphonogram(), isrune(), isspecial() and
toascii(), conform to ISO/IEC 9899:1990 (``ISO C90'').

Эта же страница на самом деле не ссылается на страницу для isnumber(), но я экстраполировал его URL из ссылок на man-страницы для стандартных функций, и нашел этот:

The isnumber() function behaves similarly to isdigit(), but may recognize
additional characters, depending on the current locale setting.

Результат № 4 в Google для isnumber ctype

1