Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/locale/setlocale"

From cppreference.com
< cpp‎ | locale
(how can an int be null???)
m (posix notes)
Line 25: Line 25:
  
 
Because {{tt|setlocale}} modifies global state which affects execution of locale-dependent functions, it is undefined behavior to call it from one thread, while another thread is executing any of the following functions: {{lc|std::fprintf}}, {{lc|std::isprint}}, {{lc|std::iswdigit}}, {{lc|std::localeconv}}, {{lc|std::tolower}}, {{lc|std::fscanf}}, {{lc|std::ispunct}}, {{lc|std::iswgraph}}, {{lc|std::mblen}}, {{lc|std::toupper}}, {{lc|std::isalnum}}, {{lc|std::isspace}}, {{lc|std::iswlower}}, {{lc|std::mbstowcs}}, {{lc|std::towlower}}, {{lc|std::isalpha}}, {{lc|std::isupper}}, {{lc|std::iswprint}}, {{lc|std::mbtowc}}, {{lc|std::towupper}}, {{lc|std::isblank}}, {{lc|std::iswalnum}}, {{lc|std::iswpunct}}, {{lc|std::setlocale}}, {{lc|std::wcscoll}}, {{lc|std::iscntrl}}, {{lc|std::iswalpha}}, {{lc|std::iswspace}}, {{lc|std::strcoll}}, {{lc|std::wcstod}}, {{lc|std::isdigit}}, {{lc|std::iswblank}}, {{lc|std::iswupper}}, {{lc|std::strerror}}, {{lc|std::wcstombs}}, {{lc|std::isgraph}}, {{lc|std::iswcntrl}}, {{lc|std::iswxdigit}}, {{lc|std::strtod}}, {{lc|std::wcsxfrm}}, {{lc|std::islower}}, {{lc|std::iswctype}}, {{lc|std::isxdigit}}.
 
Because {{tt|setlocale}} modifies global state which affects execution of locale-dependent functions, it is undefined behavior to call it from one thread, while another thread is executing any of the following functions: {{lc|std::fprintf}}, {{lc|std::isprint}}, {{lc|std::iswdigit}}, {{lc|std::localeconv}}, {{lc|std::tolower}}, {{lc|std::fscanf}}, {{lc|std::ispunct}}, {{lc|std::iswgraph}}, {{lc|std::mblen}}, {{lc|std::toupper}}, {{lc|std::isalnum}}, {{lc|std::isspace}}, {{lc|std::iswlower}}, {{lc|std::mbstowcs}}, {{lc|std::towlower}}, {{lc|std::isalpha}}, {{lc|std::isupper}}, {{lc|std::iswprint}}, {{lc|std::mbtowc}}, {{lc|std::towupper}}, {{lc|std::isblank}}, {{lc|std::iswalnum}}, {{lc|std::iswpunct}}, {{lc|std::setlocale}}, {{lc|std::wcscoll}}, {{lc|std::iscntrl}}, {{lc|std::iswalpha}}, {{lc|std::iswspace}}, {{lc|std::strcoll}}, {{lc|std::wcstod}}, {{lc|std::isdigit}}, {{lc|std::iswblank}}, {{lc|std::iswupper}}, {{lc|std::strerror}}, {{lc|std::wcstombs}}, {{lc|std::isgraph}}, {{lc|std::iswcntrl}}, {{lc|std::iswxdigit}}, {{lc|std::strtod}}, {{lc|std::wcsxfrm}}, {{lc|std::islower}}, {{lc|std::iswctype}}, {{lc|std::isxdigit}}.
 +
 +
POSIX also defines a locale named "POSIX", which is always accessible and is exactly equivalent to the default minimal "C" locale.
 +
 +
POSIX also specifies that the returned pointer, not just the contents of the pointed-to string, may be invalidated by subsequent calls to setlocale.
  
 
===Example===
 
===Example===

Revision as of 07:03, 6 November 2014

 
 
 
Defined in header <clocale>
char* setlocale( int category, const char* locale);

The setlocale function installs the specified system locale or its portion as the new C locale. The modifications remain in effect and influences the execution of all locale-sensitive C library functions until the next call to setlocale. If locale is a null pointer, setlocale queries the current C locale without modifying it.

Contents

Parameters

category - locale category identifier, one of the LC_xxx macros. May be 0.
locale - system-specific locale identifier. Can be "" for the user-preferred locale or "C" for the minimal locale

Return value

Pointer to a narrow null-terminated string identifying the C locale after applying the changes, if any, or null pointer on failure.

Notes

During program startup, the equivalent of std::setlocale(LC_ALL, "C"); is executed before any user code is run.

Although the return type is char*, modifying the pointed-to characters is undefined behavior.

Because setlocale modifies global state which affects execution of locale-dependent functions, it is undefined behavior to call it from one thread, while another thread is executing any of the following functions: std::fprintf, std::isprint, std::iswdigit, std::localeconv, std::tolower, std::fscanf, std::ispunct, std::iswgraph, std::mblen, std::toupper, std::isalnum, std::isspace, std::iswlower, std::mbstowcs, std::towlower, std::isalpha, std::isupper, std::iswprint, std::mbtowc, std::towupper, std::isblank, std::iswalnum, std::iswpunct, std::setlocale, std::wcscoll, std::iscntrl, std::iswalpha, std::iswspace, std::strcoll, std::wcstod, std::isdigit, std::iswblank, std::iswupper, std::strerror, std::wcstombs, std::isgraph, std::iswcntrl, std::iswxdigit, std::strtod, std::wcsxfrm, std::islower, std::iswctype, std::isxdigit.

POSIX also defines a locale named "POSIX", which is always accessible and is exactly equivalent to the default minimal "C" locale.

POSIX also specifies that the returned pointer, not just the contents of the pointed-to string, may be invalidated by subsequent calls to setlocale.

Example

#include <cstdio>
#include <clocale>
#include <ctime>
#include <cwchar>
 
int main()
{
    // the C locale will be UTF-8 enabled English;
    // decimal dot will be German
    // date and time formatting will be Japanese
    std::setlocale(LC_ALL, "en_US.UTF-8");
    std::setlocale(LC_NUMERIC, "de_DE");
    std::setlocale(LC_TIME, "ja_JP");
 
    wchar_t str[100];
    std::time_t t = std::time(NULL);
    std::wcsftime(str, 100, L"%A %c", std::localtime(&t));
    std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, str);
}

Output:

Number: 3,14
Date: 月曜日 2011年12月19日 18時04分40秒

See also

locale categories for std::setlocale
(macro constant) [edit]
set of polymorphic facets that encapsulate cultural differences
(class) [edit]
C documentation for setlocale