std::isdigit(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… NAME πŸ’…

std::isdigit - std::isdigit

Okay bestie, welcome to std::isdigit(3) from the C++ Standard Libary manual β€” yes, that’s the manual name, typo and all, iykyk πŸ’…. This function is the main character for checking whether a character is one of the decimal digits.


✨ Synopsis ✨

Defined in header <cctype>:

int isdigit( int ch );

Checks if the given character is one of the 10 decimal digits: 0123456789.

The behavior is undefined if the value of ch is not representable as unsigned char and is not equal to EOF. This is not a drill, bestie 😭.

πŸŽ€ Parameters πŸŽ€

  • ch β€” character to classify 🫢

🌸 Return value 🌸

Non-zero value if the character is a numeric character, zero otherwise. Simple as that, periodt ✨.


πŸ¦‹ Notes πŸ¦‹

isdigit and isxdigit are the only standard narrow character classification functions that are not affected by the currently installed C locale. Although some implementations (e.g. Microsoft in 1252 codepage) may classify additional single-byte characters as digits. So like… mostly iconic and locale-proof, but not every implementation is out here behaving identically πŸ‘€.

Like all other functions from <cctype>, the behavior of std::isdigit is undefined if the argument’s value is neither representable as unsigned char nor equal to EOF. To use these functions safely with plain chars (or signed chars), the argument should first be converted to unsigned char:

        bool my_isdigit(char ch)
        {
            return std::isdigit(static_cast<unsigned char>(ch));
        }

Similarly, they should not be directly used with standard algorithms when the iterator’s value type is char or signed char. Instead, convert the value to unsigned char first:

        int count_digits(const std::string& s)
        {
            return std::count_if(s.begin(), s.end(),
                              // static_cast<int(*)(int)>(std::isdigit)
       // wrong
                              // [](int c){ return std::isdigit(c); }
       // wrong
                              // [](char c){ return std::isdigit(c); }
       // wrong
                                 [](unsigned char c){ return std::isdigit(c); }
       // correct
                                );
        }

This is the β€œplease do the cast, I’m begging” part of the page, and honestly it’s giving safety-check realness πŸ”₯.


πŸ‘€ See also πŸ‘€

  • isdigit(std::locale) β€” checks if a character is classified as a digit by a locale (function template)
  • iswdigit β€” checks if a wide character is a digit (function)
  • C documentation for isdigit

And because the page also drops this whole ASCII values classification chart, here it is verbatim, bestie β€” no details left behind 🫢:

               ASCII values            characters    iscntrl  isprint  isspace
       isblank  isgraph  ispunct  isalnum  isalpha  isupper  islower  isdigit
       isxdigit decimal hexadecimal   octal                   iswcntrl iswprint
       iswspace iswblank iswgraph iswpunct iswalnum iswalpha iswupper iswlower
       iswdigit iswxdigit 0–8     \x0–\x8     \0–\10    control codes   β‰ 0
       0        0        0        0        0        0        0        0
       0        0        0
                                     (NUL, etc.)  9       \x9         \11
       tab (\t)        β‰ 0       0        β‰ 0       β‰ 0       0        0        0
       0        0        0        0        0
                                     whitespaces 10–13   \xA–\xD     \12–\15
       (\n, \v, \f,    β‰ 0       0        β‰ 0       0        0        0        0
       0        0        0        0        0
                                     \r) 14–31   \xE–\x1F    \16–\37   control
       codes   β‰ 0       0        0        0        0        0        0        0
       0        0        0        0 32      \x20        \40       space
       0        β‰ 0       β‰ 0       β‰ 0       0        0        0        0
       0        0        0        0 33–47   \x21–\x2F   \41–\57
       !"#$%&'()*+,-./ 0        β‰ 0       0        0        β‰ 0       β‰ 0       0
       0        0        0        0        0 48–57   \x30–\x39   \60–\71
       0123456789      0        β‰ 0       0        0        β‰ 0       0        β‰ 0
       0        0        0        β‰ 0       β‰ 0 58–64   \x3A–\x40   \72–\100
       :;<=>?@         0        β‰ 0       0        0        β‰ 0       β‰ 0       0
       0        0        0        0        0 65–70   \x41–\x46   \101–\106
       ABCDEF          0        β‰ 0       0        0        β‰ 0       0        β‰ 0
       β‰ 0       β‰ 0       0        0        β‰ 0 71–90   \x47–\x5A   \107–\132
       GHIJKLMNOP      0        β‰ 0       0        0        β‰ 0       0        β‰ 0
       β‰ 0       β‰ 0       0        0        0
                                     QRSTUVWXYZ 91–96   \x5B–\x60   \133–\140
       [\]^_`          0        β‰ 0       0        0        β‰ 0       β‰ 0       0
       0        0        0        0        0 97–102  \x61–\x66   \141–\146
       abcdef          0        β‰ 0       0        0        β‰ 0       0        β‰ 0
       β‰ 0       0        β‰ 0       0        β‰ 0 103–122 \x67–\x7A   \147–\172
       ghijklmnop      0        β‰ 0       0        0        β‰ 0       0        β‰ 0
       β‰ 0       0        β‰ 0       0        0
                                     qrstuvwxyz 123–126 \x7B–\x7E   \172–\176
       {|}~            0        β‰ 0       0        0        β‰ 0       β‰ 0       0
       0        0        0        0        0 127     \x7F        \177
       backspace       β‰ 0       0        0        0        0        0        0
       0        0        0        0        0
                                     character (DEL)

Okay that’s the whole vibe, mwah πŸ’‹ β€” source: http://cppreference.com, version/date: 2024.06.10, page: std::isdigit(3) 🌈✨

πŸ“¦ where this page comes from