locale.h
主要对时间和货币的书写格式进行了封装,从而符合不同地区的使用习惯。故而locale.h
中设计了两个用于本地化的函数
char *setlocale(int category, const char *locale)
struct lconv *localeconv(void)
前者用于设置或读取本地化信息,locale
即代表某个区域的字符串,category
代表将要设置的函数类别,其输入参数包括
值 | 宏 | 说明 | 影响的函数 |
---|---|---|---|
0 | LC_ALL | 下面的所有选项 | |
1 | LC_COLLATE | 字符串比较 | strcoll 和 strxfrm |
2 | LC_CTYPE | 字符分类和转换 | 所有字符函数 |
3 | LC_MONETARY | 货币格式 | localeconv() |
4 | LC_NUMERIC | 小数点分隔符 | localeconv() |
5 | LC_TIME | 日期和时间格式 | strftime() |
6 | LC_MESSAGES | 系统响应 |
其中,localeconv()
函数被封装在locale.h
中,其返回值是一个lconv
结构,主要用于描述货币的表示方法,每个字段的含义在下面的注释中说明。在注释中,cs
表示当前区域的货币符号。
typedef struct {
char *decimal_point; //常规数值的小数点字符
char *thousands_sep; //常规数值的千位分隔符
char *grouping; //常规数值中每组数字大小的字符串
char *int_curr_symbol; //国际货币符号使用的字符串。前三个字符由 ISO 4217:1987 指定,第四个字符用于分隔货币符号和货币量。
char *currency_symbol; //当前区域的货币符号,后文用cs表示
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; //cs在正货币值中的位置
char p_sep_by_space; //cs与正货币值之间是否使用空格
char n_cs_precedes; //cs在负货币值中的位置
char n_sep_by_space; //cs与负货币值之间是否使用空格
char p_sign_posn; //表示正货币值中正号的位置
char n_sign_posn; //表示负货币值中负号的位置
} lconv
其中,grouping
和mon_grouping
均为字符串,分别表示在常规数值和货币中每组数字大小。字符串中每个字符都代表一个整数,用以指定当前组的位数。
当前区域的货币符号cs
与货币值之间的排版方式为
值为1 | 值为0 | |
---|---|---|
p_cs_precedes | cs在正货币值之前 | cs在正货币值之后 |
p_sep_by_space | cs和正货币值之间用空格 | cs和正货币值之间不使用空格 |
n_cs_precedes | cs在负货币值之前 | cs在负货币值之后。 |
n_sep_by_space | cs和负货币值之间使用空格 | cs和负货币值之间不使用空格 |
货币中正负号的位置通过p_sign_posn
和n_sign_posn
来调节,二者均有5个取值。
对于-1美元,其cs
的符号设为$,当其n_sign_posn
取值从0-5,n_cs_precedes
分别为0,1
时,表示方法分别如下
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | (1.00 $) |
-1.00 $ |
1.00 $- |
1.00 -$ |
1.00 $- |
1 | ($1.00 ) |
-$1.00
|
$1.00 - |
-$1.00
|
$-1.00
|
说明 | 括号 | 数值和cs之前 | 数值和cs之后 | cs之前 | cs之后 |