char *
setlocale(int category, const char *locale)
struct lconv *
localeconv(void)
)
function sets the C library's notion
of natural language formatting style
for particular sets of routines.
Each such style is called a
`locale'
and is invoked using an appropriate name passed as a C string.
The
localeconv()
routine returns the current locale's parameters
for formatting numbers.
The
setlocale()
function recognizes several categories of routines.
These are the categories and the sets of routines they select:
LC_ALLLC_COLLATE)
and
strxfrm().
LC_CTYPE)
function.
LC_MESSAGESLC_MONETARY)
function.
LC_NUMERIC)
and
scanf(),
as well as values returned by
localeconv().
LC_TIME)
function.
Only three locales are defined by default,
the empty string
""
which denotes the native environment, and the
"C"
and
"POSIX"
locales, which denote the C language environment.
A
locale
argument of
NULL
causes
setlocale()
to return the current locale.
By default, C programs start in the
"C"
locale.
The format of the locale string is described in
nls(7).
The only function in the library that sets the locale is
setlocale();
the locale is never changed as a side effect of some other routine.
Changing the setting of
LC_MESSAGES
has no effect on catalogs that have already been opened by
catopen(3).
The
localeconv()
function returns a pointer to a structure
which provides parameters for formatting numbers,
especially currency values:
struct lconv {
char *decimal_point;
char *thousands_sep;
char *grouping;
char *int_curr_symbol;
char *currency_symbol;
char *mon_decimal_point;
char *mon_thousands_sep;
char *mon_grouping;
char *positive_sign;
char *negative_sign;
char int_frac_digits;
char frac_digits;
char p_cs_precedes;
char p_sep_by_space;
char n_cs_precedes;
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
char int_p_cs_precedes;
char int_n_cs_precedes;
char int_p_sep_by_space;
char int_n_sep_by_space;
char int_p_sign_posn;
char int_n_sign_posn;
};
The individual fields have the following meanings:
decimal_pointthousands_sepgroupingCHAR_MAX.
If the list is terminated with 0,
the last group size before the 0 is repeated to account for all the digits.
If the list is terminated with
CHAR_MAX,
no more grouping is performed.
int_curr_symbolcurrency_symbolmon_decimal_pointmon_thousands_sepmon_groupinggrouping
but for monetary values.
positive_signnegative_signint_frac_digitsfrac_digitsp_cs_precedesp_sep_by_spacen_cs_precedesp_cs_precedes
but for negative values.
n_sep_by_spacep_sep_by_space
but for negative values.
p_sign_posnpositive_sign
with respect to a nonnegative quantity and the
currency_symbol.
n_sign_posnp_sign_posn
but for negative currency values.
int_p_cs_precedesint_n_cs_precedesint_p_cs_precedes
but for negative values.
int_p_sep_by_spaceint_n_sep_by_spaceint_p_sep_by_space
but for negative values.
int_p_sign_posnpositive_sign
with respect to a nonnegative quantity and the
currency_symbol,
for internationally formatted nonnegative monetary values.
int_n_sign_posnint_p_sign_posn
but for negative values.
The positional parameters in
p_sign_posn,
n_sign_posn,
int_p_sign_posn
and
int_n_sign_posn
are encoded as follows:
0123currency_symbol.
4currency_symbol.
Unless mentioned above,
an empty string as a value for a field
indicates a zero length result or
a value that is not in the current locale.
A
CHAR_MAX
result similarly denotes an unavailable value.
)
function returns
NULL
and fails to change the locale
if the given combination of
category
and
locale
makes no sense.
The
localeconv()
function returns a pointer to a static object
which may be altered by later calls to
setlocale()
or
localeconv().
setlocale(LC_ALL, "de");
setlocale(LC_COLLATE, "fr");
When a process is started, its current locale is set to the C or POSIX
locale.
An internationalized program that depends on locale data not defined in
the C or POSIX locale must invoke the setlocale subroutine in the
following manner before using any of the locale-specific information:
setlocale(LC_ALL, "");
)
and
localeconv()
functions conform to
ANSI X3.159-1989 (``ANSI C89'')
and
ISO/IEC 9899:1990 (``ISO C90'') .
The
int_p_cs_precedes,
int_n_cs_precedes,
int_p_sep_by_space,
int_n_sep_by_space,
int_p_sign_posn
and
int_n_sign_posn
members of
struct lconv
were introduced in
ISO/IEC 9899:1999 (``ISO C99'') .
)
and
localeconv()
functions first appeared in
4.4BSD.
"C"
and
"POSIX"
locales for all but the
LC_CTYPE
locale.
In spite of the gnarly currency support in
localeconv(),
the standards don't include any functions
for generalized currency formatting.
LC_COLLATE
does not make sense for many languages.
Use of
LC_MONETARY
could lead to misleading results until we have a real time currency
conversion function.
LC_NUMERIC
and
LC_TIME
are personal choices and should not be wrapped up with the other categories.
Multibyte locales aren't supported for static binaries.