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_ALL
LC_COLLATE
)
and
strxfrm(
).
LC_CTYPE
)
function.
LC_MESSAGES
LC_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_point
thousands_sep
grouping
CHAR_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_symbol
currency_symbol
mon_decimal_point
mon_thousands_sep
mon_grouping
grouping
but for monetary values.
positive_sign
negative_sign
int_frac_digits
frac_digits
p_cs_precedes
p_sep_by_space
n_cs_precedes
p_cs_precedes
but for negative values.
n_sep_by_space
p_sep_by_space
but for negative values.
p_sign_posn
positive_sign
with respect to a nonnegative quantity and the
currency_symbol
.
n_sign_posn
p_sign_posn
but for negative currency values.
int_p_cs_precedes
int_n_cs_precedes
int_p_cs_precedes
but for negative values.
int_p_sep_by_space
int_n_sep_by_space
int_p_sep_by_space
but for negative values.
int_p_sign_posn
positive_sign
with respect to a nonnegative quantity and the
currency_symbol
,
for internationally formatted nonnegative monetary values.
int_n_sign_posn
int_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:
0
1
2
3
currency_symbol
.
4
currency_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.