std::isdigit(std::locale)

From cppreference.com
< cpp‎ | locale
 
 
Localizations library
Locales and facets
Locales
Facet category base classes
ctype facets
numeric facets
collate facets
time facets
monetary facets
messages facets
Character classification and conversion
Character classification
Conversions
(C++11/17*)
(C++11/17*)
Code conversion facets
(C++11/17*)
(C++11/17*)    
(C++11/17*)
C locale
 
Defined in header <locale>
template< class CharT >
bool isdigit( CharT ch, const locale& loc );

Checks if the given character is classified as a digit by the given locale's std::ctype facet.

Parameters

ch - character
loc - locale

Return value

Returns true if the character is classified as a digit, false otherwise.

Possible implementation

template< class CharT >
bool isdigit( CharT ch, const std::locale& loc ) {
    return std::use_facet<std::ctype<CharT>>(loc).is(std::ctype_base::digit, ch);
}

Example

#include <iostream>
#include <locale>
#include <string>
#include <set>
 
struct jdigit_ctype : std::ctype<wchar_t>
{
    std::set<wchar_t> jdigits{L'一',L'二',L'三',L'四',L'五',L'六',L'七',L'八',L'九',L'十'};
    bool do_is(mask m, char_type c) const
    {
        if ((m & digit) && jdigits.count(c))
            return true; // Japanese digits will be classified as digits
        return ctype::do_is(m, c); // leave the rest to the parent class
    }
};
 
int main()
{
    std::wstring text = L"123一二三123";
    std::locale loc(std::locale(""), new jdigit_ctype);
 
    std::locale::global(std::locale(""));
    std::wcout.imbue(std::locale());
 
    for (const wchar_t c : text)
        if (std::isdigit(c, loc))
            std::wcout << c << " is a digit\n";
        else
            std::wcout << c << " is NOT a digit\n";
}

Possible output:

1 is a digit
2 is a digit
3 is a digit
一 is a digit
二 is a digit
三 is a digit
1 is NOT a digit
2 is NOT a digit
3 is NOT a digit

See also

checks if a character is a digit
(function)
checks if a wide character is a digit
(function)