SETLOCALE(3) AerieBSD 1.0 Refernce Manual SETLOCALE(3)

NAME

setlocalelocaleconv natural language formatting for C

SYNOPSIS

#include <locale.h>

char* setlocale(int category, const char *locale);

structlconv * localeconv(void);

DESCRIPTION

The setlocale(); 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
Set the entire locale generically.
LC_COLLATE
Set a locale for string collation routines. This controls alphabetic ordering in strcoll(); and strxfrm();.
LC_CTYPE
Set a locale for the ctype(3) functions. This controls recognition of upper and lower case, alphabetic or non-alphabetic characters, and so on. The real work is done by the setrunelocale(); function.
LC_MONETARY
Set a locale for formatting monetary values; this affects the localeconv(); function.
LC_NUMERIC
Set a locale for formatting numbers. This controls the formatting of decimal points in input and output of floating point numbers in functions such as printf(); and scanf();, as well as values returned by localeconv();.
LC_TIME
Set a locale for formatting dates and times using the strftime(); 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 only function in the library that sets the locale is setlocale();; the locale is never changed as a side effect of some other routine.

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;
};

The individual fields have the following meanings:
decimal_point
The decimal point character, except for currency values.
thousands_sep
The separator between groups of digits before the decimal point, except for currency values.
grouping
The sizes of the groups of digits, except for currency values. This is a pointer to a vector of integers, each of size char, representing group size from low order digit groups to high order (right to left). The list may be terminated with 0 or 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
The standardized international currency symbol.
currency_symbol
The local currency symbol.
mon_decimal_point
The decimal point character for currency values.
mon_thousands_sep
The separator for digit groups in currency values.
mon_grouping
Like grouping but for currency values.
positive_sign
The character used to denote non-negative currency values, usually the empty string.
negative_sign
The character used to denote negative currency values, usually a minus sign.
int_frac_digits
The number of digits after the decimal point in an international-style currency value.
frac_digits
The number of digits after the decimal point in the local style for currency values.
p_cs_precedes
1 if the currency symbol precedes the currency value for non-negative values, 0 if it follows.
p_sep_by_space
1 if a space is inserted between the currency symbol and the currency value for non-negative values, 0 otherwise.
n_cs_precedes
Like p_cs_precedes but for negative values.
n_sep_by_space
Like p_sep_by_space but for negative values.
p_sign_posn
The location of the positive_sign with respect to a non-negative quantity and the currency_symbol, coded as follows:

0
Parentheses around the entire string.
1
Before the string.
2
After the string.
3
Just before currency_symbol.
4
Just after currency_symbol.
n_sign_posn
Like p_sign_posn but for negative currency values.

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.

RETURN VALUES

The setlocale(); 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();.

SEE ALSO

mklocale(1), strcoll(3), strxfrm(3)

STANDARDS

The setlocale(); and localeconv(); functions conform to

HISTORY

The setlocale(); and localeconv(); functions first appeared in 4.4BSD.

BUGS

The current implementation supports only the "\&""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.


AerieBSD 1.0 Reference Manual August 26 2008 SETLOCALE(3)