<locale.h> -- 类型
阅读:0       作者:严长生

struct lconv 包含了与数字和货币有关的区域设置信息的结构体

区域设置是与某个地区(或者说某个国家)的语言和文化相关的一系列内容,包含日期格式、数字格式、货币格式(例如货币符号、国际货币代码)、字符处理(例如字符分类)、字符比较(字符排序)等多个方面,其中数字和货币信息还包含了很多细节,为了便于管理,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 被设置为"3",那么数字的分隔效果为 12,172,390,000;
  • grouping 被设置为"123",那么数字的分隔效果为 12,172,390,00,0;
  • grouping 被设置为"31",那么数字的分隔效果为 1,2,1,7,2,3,9,0,000;
  • grouping 被设置为"13",那么数字的分隔效果为 1,217,239,000,0。

按照从左到右的顺序看 grouping 包含的数字,它们依次指明了从右到左(从低位到高位)插入千位分隔符的位置,这两者的顺序恰好是相反的。如果数字的位数过多,那么按照 grouping 最右边的数字(结束标志0前面的数字)插入千位分隔符。

如果 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 的位置:
  • 0:货币符号 currency_symbol 和数字放在括号中,例如($ -26.3)(-26.3 $)
  • 1:negative_sign 位于货币符号 currency_symbol 和数字之前,例如-$ 26.3-26.3 $
  • 2:negative_sign 位于货币符号 currency_symbol 和数字之后,例如$ 26.3-26.3 $-
  • 3:negative_sign 紧挨着放在货币符号 currency_symbol 之前,例如-$ 26.326.3 -$
  • 4:negative_sign 紧挨着放在货币符号 currency_symbol 之后,例如$- 26.326.3 $-

n_sign_posn 为 CHAR_MAX 表示未定义。
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_pint_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