C 标准库 - <locale.h>

简介

<locale.h> 是 C 标准库中的一个头文件,用于支持程序的国际化和本地化。它提供了一组函数和宏来设置或查询程序的本地化信息,例如日期、时间、货币、数字格式等。

接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两个重要的函数。

库宏

下面列出了头文件 locale.h 中定义的宏,这些宏将在下列的两个函数中使用:

序号宏 & 描述
1 LC_ALL
用于设置或查询所有本地化类别。
2 LC_COLLATE
用于设置或查询字符串比较的本地化信息。
3 LC_CTYPE
用于设置或查询字符处理的本地化信息。
4 LC_MONETARY
用于设置或查询货币格式的本地化信息。
5 LC_NUMERIC
用于设置或查询数字格式的本地化信息(例如小数点的符号)。
6 LC_TIME
用于设置或查询时间格式的本地化信息。
7 locale_t
表示区域设置信息的类型。

库函数

下面列出了头文件 locale.h 中定义的函数:

序号函数 & 描述
1char *setlocale(int category, const char *locale)
设置或读取地域化信息。
2struct lconv *localeconv(void)
设置或读取地域化信息。
3struct lconv *newlocale(void)
创建一个新的本地化对象。
4struct lconv *freelocale(void)
释放一个本地化对象。
5struct lconv *uselocale(void)
设置或查询线程的本地化对象。

实例

设置和查询本地化信息:

实例

#include <stdio.h>
#include <locale.h>

int main() {
    // 设置本地化信息为用户环境变量中的默认设置
    setlocale(LC_ALL, "");

    // 获取和打印当前的本地化信息
    printf("Current locale for LC_ALL: %s\n", setlocale(LC_ALL, NULL));
    printf("Current locale for LC_TIME: %s\n", setlocale(LC_TIME, NULL));
    printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));

    return 0;
}

编译输出结果为:

Current locale for LC_ALL: zh_CN.UTF-8
Current locale for LC_TIME: zh_CN.UTF-8
Current locale for LC_NUMERIC: zh_CN.UTF-8

获取数字和货币格式信息:

实例

#include <stdio.h>
#include <locale.h>

int main() {
    // 设置本地化信息为用户环境变量中的默认设置
    setlocale(LC_ALL, "");

    // 获取本地化的数字和货币格式信息
    struct lconv *lc = localeconv();

    // 打印数字和货币格式信息
    printf("Decimal point character: %s\n", lc->decimal_point);
    printf("Thousands separator: %s\n", lc->thousands_sep);
    printf("Currency symbol: %s\n", lc->currency_symbol);

    return 0;
}

编译输出结果为:

Decimal point character: .
Thousands separator: ,
Currency symbol: ¥

使用自定义本地化对象:

实例

#include <stdio.h>
#include <locale.h>
#include <xlocale.h>

int main() {
    // 创建一个新的本地化对象,使用 "en_US.UTF-8" 区域设置
    locale_t newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0);

    // 将当前线程的本地化对象设置为新的本地化对象
    locale_t oldloc = uselocale(newloc);

    // 获取和打印当前线程的本地化信息
    printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));

    // 释放新的本地化对象
    uselocale(oldloc);
    freelocale(newloc);

    return 0;
}

编译输出结果为:

Current locale for LC_NUMERIC: C

库结构

typedef struct {
   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;
} lconv

以下是各字段的描述:

序号字段 & 描述
1 decimal_point
用于非货币值的小数点字符。
2 thousands_sep
用于非货币值的千位分隔符。
3 grouping
一个表示非货币量中每组数字大小的字符串。每个字符代表一个整数值,每个整数指定当前组的位数。值为 0 意味着前一个值将应用于剩余的分组。
4 int_curr_symbol
国际货币符号使用的字符串。前三个字符是由 ISO 4217:1987 指定的,第四个字符用于分隔货币符号和货币量。
5 currency_symbol
用于货币的本地符号。
6 mon_decimal_point
用于货币值的小数点字符。
7 mon_thousands_sep
用于货币值的千位分隔符。
8 mon_grouping
一个表示货币值中每组数字大小的字符串。每个字符代表一个整数值,每个整数指定当前组的位数。值为 0 意味着前一个值将应用于剩余的分组。
9 positive_sign
用于正货币值的字符。
10 negative_sign
用于负货币值的字符。
11 int_frac_digits
国际货币值中小数点后要显示的位数。
12 frac_digits
货币值中小数点后要显示的位数。
13 p_cs_precedes
如果等于 1,则 currency_symbol 出现在正货币值之前。如果等于 0,则 currency_symbol 出现在正货币值之后。
14 p_sep_by_space
如果等于 1,则 currency_symbol 和正货币值之间使用空格分隔。如果等于 0,则 currency_symbol 和正货币值之间不使用空格分隔。
15 n_cs_precedes
如果等于 1,则 currency_symbol 出现在负货币值之前。如果等于 0,则 currency_symbol 出现在负货币值之后。
16 n_sep_by_space
如果等于 1,则 currency_symbol 和负货币值之间使用空格分隔。如果等于 0,则 currency_symbol 和负货币值之间不使用空格分隔。
17 p_sign_posn
表示正货币值中正号的位置。
18 n_sign_posn
表示负货币值中负号的位置。

下面的值用于 p_sign_posnn_sign_posn:

描述
0 封装值和 currency_symbol 的括号。
1 放置在值和 currency_symbol 之前的符号。
2 放置在值和 currency_symbol 之后的符号。
3 紧挨着放置在值和 currency_symbol 之前的符号。
4 紧挨着放置在值和 currency_symbol 之后的符号。