区域设置是与某个地区(或者说某个国家)的语言和文化相关的一系列内容,包含日期格式、数字格式、货币格式(例如货币符号、国际货币代码)、字符处理(例如字符分类)、字符比较(字符排序)等多个方面,其中数字和货币信息还包含了很多细节,为了便于管理,C语言将这些细节信息组织成一个结构体,它的名字就是 struct lconv。
也就是说,struct lconv 是一个包含了与数字和货币有关的区域设置信息的结构体。
localeconv() 函数会返回一个 struct lconv 类型的指针,从而让用户了解与数字和货币有关的地域信息,这也是获取 struct lconv 的唯一途径。
struct lconv 包含了如下的成员变量(不分先后顺序):
成员变量 | 类型 | 地域设置为"C"时的值 | 说明 |
---|---|---|---|
decimal_point | char* | "." | 非货币数字的小数点,例如 100.25。 我们通常认为小数点就是点号.,在任何语言文化中都是固定的;其实不然,在法语、南非语、丹麦语、德语、希腊语、部分西班牙语中,小数点是逗号,。 |
thousands_sep | char* | "" | 非货币数字的千位分隔符,例如 12,172,390,000。 千位分隔符其实就是数字中的逗号。依西方的习惯,人们在数字中加入一个符号,以免因数字位数太多而难以看出它的值。所以人们在数字中,每隔三位数加入一个逗号,也就是千位分隔符,以便更加容易认出数值。 |
grouping | char* | "" | 千位分隔符 thousands_sep 分隔非货币数字时,每一个分组包含的数字个数。 我们通常认为,每隔三位数加入一个千位分隔符(例如 12,172,390,000),但是这并不是固定的,也可以每隔两位数加入一个千位分隔符(例如 1,21,72,39,00,00),或者最开始的三位数加入一个分隔符,以后每隔两位数加入一个分隔符(例如12,17,23,90,000),或者是其他情况。grouping 成员就用来指定每隔几位加入一个千位分隔符。 grouping 包含一组以\为前导符的数字,每一个数字表示插入千位分隔符的位数,例如:
如果 grouping 包含了值为 CHAR_MAX 的数字,那么表示没有进一步的分组。 |
int_curr_symbol | char* | "" | 国际货币符号(国际货币代码)。 国际货币符号由三个字母组成,遵循 ISO-4217 标准,例如,美元的国际符号是"USD",欧元的国际符号是"GBP",人民币的国际符号是"CNY"。 注意,国际货币符号后面还会紧跟一个空格,用于分隔国际货币符号和货币量,例如 USD 29.86。最终,int_curr_symbol 由四个字符组成。 |
currency_symbol | char* | "" | 本地货币符号。 适用于当前区域设置的当地流通的货币符号,例如,美元的货币符号为$,欧元的货币符号为€,人民币的货币符号为¥。 |
mon_decimal_point | char* | "" | 货币量(表示货币的数字)的小数点,例如 ¥ 25.5。 mon_decimal_point 针对货币量,而 decimal_point 针对非货币量。 |
mon_thousands_sep | char* | "" | 货币量的千位分隔符,例如 ¥ 25,000。 mon_thousands_sep 针对货币量,而 thousands_sep 针对非货币量。 |
mon_grouping | char* | "" | 千位分隔符 mon_decimal_point 分隔货币量时,每一个分组包含的数字个数,细节请参考 grouping。 mon_grouping 针对货币量,而 grouping 针对非货币量。 |
positive_sign | char* | "" | 用于表示非负(正数或者零)货币量的符号,一般为空字符串。 |
negative_sign | char* | "" | 用于表示负的货币量的符号,一般为-,也就是负号。 |
frac_digits | char | CHAR_MAX | 在当前的区域设置中(针对当地的货币格式),货币量的小数部分保留的位数,或者说货币量的小数点右侧的数字个数。 |
p_cs_precedes | char | CHAR_MAX | 货币符号 currency_symbol 是否位于非负(正数或者零)货币量之前。例如,$ 26.3就是货币符号位于货币量之前,26.3 $就是货币符号位于货币量之后。 如果 p_cs_precedes 的值为 1,那么表示货币符号位于非负货币量之前;如果 p_cs_precedes 的值为 0,那么表示货币符号位于非负货币量之后。 |
n_cs_precedes | char | CHAR_MAX | 货币符号 currency_symbol 是否位于负(正数或者零)的货币量之前。例如,$ -26.3就是货币符号位于货币量之前,-26.3 $就是货币符号位于货币量之后。 如果 n_cs_precedes 的值为 1,那么表示货币符号位于负的货币量之前;如果 n_cs_precedes 的值为 0,那么表示货币符号位于负的货币量之后。 |
p_sep_by_space | char | CHAR_MAX | 货币符号 currency_symbol 与非负(正说或者零)货币量之间是否有空格。空格用来分隔货币符号和货币量,让货币的格式更加美观。 如果 p_sep_by_space 的值为 1,那么表示货币符号与非负货币量之间有空格;如果 p_sep_by_space 的值为 0,那么表示货币符号与非负货币量之间没有空格。 |
n_sep_by_space | char | CHAR_MAX | 货币符号 currency_symbol 与负的货币量之间是否有空格。空格用来分隔货币符号和货币量,让货币的格式更加美观。 如果 n_sep_by_space 的值为 1,那么表示货币符号与负的货币量之间有空格;如果 n_sep_by_space 的值为 0,那么表示货币符号与负的货币量之间没有空格。 |
n_sign_posn | char | CHAR_MAX | 负的货币量中 negative_sign 的位置:
|
p_sign_posn | char | CHAR_MAX | 非负(正数或者零)货币量中 positive_sign 的位置,请参照 n_sign_posn。 |
int_frac_digits | char | CHAR_MAX | 和 frac_digits 类似。不过 frac_digits 针对的是当地(当前区域设置)的货币格式,而 int_frac_digits 针对的是国际货币格式。 |
int_p_cs_precedes | char | CHAR_MAX | 和 p_cs_precedes 类似。不过 p_cs_precedes 针对的是当地(当前区域设置)的货币格式,而 int_p_cs_precedes 针对的是国际货币格式。 |
int_n_cs_precedes | char | CHAR_MAX | 和 n_cs_precedes 类似。不过 n_cs_precedes 针对的是当地(当前区域设置)的货币格式,而 int_n_cs_precedes 针对的是国际货币格式。 |
int_p_sep_by_space | char | CHAR_MAX | 和 p_sep_by_space 类似。不过 p_sep_by_space 针对的是当地(当前区域设置)的货币格式,而 int_p_sep_by_space 针对的是国际货币格式。 |
int_n_sep_by_space | char | CHAR_MAX | 和 n_sep_by_space 类似。不过 n_sep_by_space 针对的是当地(当前区域设置)的货币格式,而 int_n_sep_by_space 针对的是国际货币格式。 |
int_p_sign_posn | char | CHAR_MAX | 和 p_sign_posn 类似。不过 p_sign_posn 针对的是当地(当前区域设置)的货币格式,而 int_p_sign_posn 针对的是国际货币格式。 |
int_n_sign_posn | char | CHAR_MAX | 和 n_sign_posn 类似。不过 n_sign_posn 针对的是当地(当前区域设置)的货币格式,而 int_n_sign_posn 针对的是国际货币格式。 |
如果 char * 类型的成员变量的值为"",或者 char 类型的成员变量的值为CHAR_MAX,那么表示(在当前的区域设置中)该成员变量的值不可用(无效)。
以int_p和int_n开头的成员变量(最后六个、淡黄色背景的成员变量)是 C99 标准新加入的,请确认您的编译器是否支持。
下表给出了依照当地习惯对货币量$-3.00格式化的各种方式,它们由 struct lconv 中的三个成员的值决定,分别是 n_sep_by_space、n_sign_posn 和 n_cs_precedes。
n_sep_by_space: 0 | |||||
---|---|---|---|---|---|
n_sign_posn | 0 | 1 | 2 | 3 | 4 |
n_cs_precedes: 0 | (3.00$) | -3.00$ | 3.00$- | 3.00-$ | 3.00$- |
n_cs_precedes: 1 | ($3.00) | -$3.00 | $3.00- | -$3.00 | $-3.00 |
n_sep_by_space: 1 | |||||
n_sign_posn | 0 | 1 | 2 | 3 | 4 |
n_cs_precedes: 0 | (3.00 $) | -3.00 $ | 3.00 $- | 3.00 -$ | 3.00 $- |
n_cs_precedes: 1 | ($ 3.00) | -$ 3.00 | $ 3.00- | -$ 3.00 | $- 3.00 |