C 语言 clocale 头文件

7 Jan 2025 | 7 分钟阅读

本文将介绍 C 语言中的 clocale 头文件,包括其语法、参数、特性和示例。

C 语言中的 <clocale> 头文件提供了处理 C 区域设置的函数。一组参数决定了数据如何格式化,包括日期和数字。它是 C 标准库的一部分,可以在 C 中访问。

C 编程语言支持本地化设置,包括特定于文化的日期格式或特定于国家的货币符号。C++ 中的 <locale> 头文件提供了处理本地化和国际化的设施。

最小的本地化由 "C" 表示。C++ 中的 <clocale> 或 <locale.h> 头文件提供了处理特定于本地化信息的函数和设施。在所有 C 程序上,这是自动使用的本地化。

此头文件包含几个声明、setlocale 和 localeconv 函数,以及一些要与 struct lconv 一起使用的宏。它们用于指定特定于给定本地化的数据。

1. 本地化设置

<clocale> 头文件中的函数用于设置或检索当前本地化。这些函数影响日期、数字、货币和字符分类等信息的格式化和解释,例如数字、日期、时间和货币。

2. 本地化管理任务包括

setlocale: 此函数可以设置或检索程序的当前本地化。它接受两个参数:类别(例如,用于数字格式化的 LC_NUMERIC)和本地化名称(例如,“en_US”)。

3. 数字格式化

std::num_put: C++ 标准库的此本地化库功能允许您根据当前本地化将数字数据格式化为字符串。

std::num_get: std::num_get 是一个对本地化敏感的面孔,用于从字符串中读取数字值。

4. 字符串排序

std::collate: 此函数通过提供字符串排序实用程序,允许您根据当前本地化的约定比较字符串。

5. 字符分类

std::ctype: 一个提供字符分类功能的函数,例如确定字符是字母还是数字,以及将其大小写从大写转换为小写。

6. 日期和时间格式化

<ctime> 头文件中的 std::strftime 等函数会受到当前本地化的影响。使用本地化设置格式化日期和时间。

clocale 头文件的方法

  1. setlocale
  2. localeconv

1. setlocale

setlocale 函数用于设置或查询程序的当前本地化。它影响各种对当前本地化敏感的函数(如与字符分类和字符串转换相关的函数)的行为。如果将 NULL 作为 locale 参数的值提供,还可以使用该函数获取当前活动本地化的名称。

在解释和执行特定的输入/输出和转换操作时,会考虑特定于语言的设置和特定于位置的信息。特定本地化数据通常根据用户偏好或本地化在运行环境中设置。但是,无论此系统本地化如何,所有 C 程序在启动时都会设置 "C" 本地化。它是一个非常中性的本地化,具有很少的本地化信息,可确保程序结果可预测。可以通过将 "" 作为参数 locale 调用此函数来利用环境的默认本地化。

程序启动时选择 "C" 本地化。它与使用 setlocale(LC_ALL, "C") 设置的本地化相同。调用 setlocale(LC_ALL, "") 将选择环境中选择的本地化设置。参数类别指示此函数影响当前本地化的哪些部分。

语法

它具有以下语法:

参数

类别

受影响区域的一部分。它是 <clocale> 定义为宏的以下常量值之一

  1. 值 - 受影响本地化的部分。
  2. LC_ALL - 整个本地化。
  3. LC_COLLATE - 它会影响 strcoll 和 strxfrm 的行为。
  4. LC_CTYPE - 它会影响多字节和宽字符函数以及字符处理函数(除 isdigit 和 isxdigit 之外的所有 <cctype> 函数)。
  5. LC_MONETARY - 它会修改 localeconv 返回的货币格式化数据
  6. LC_NUMERIC - 它会影响 localeconv 提供的非货币数据以及在准备好的输入/输出操作和字符串格式化方法中的小数点字符。
  7. LC_TIME - 它会影响 strftime 的行为。

区域设置

C 字符串包含 C 本地化的名称。虽然它们因系统而异,但至少需要存在以下两种本地化

本地化名称描述
"C" 最小 "C"locale
" " 环境默认值locale

如果此参数的值为 NULL,则该函数不会更改当前本地化,但它仍会返回当前本地化的名称。

返回值

它返回一个指向标识 C 本地化的字符串的指针,在应用更改后。否则,它会返回一个 NULL 指针。如果类别为 LC_ALL 并且为不同的本地化元素分配了不同的值,则返回字符串的格式在不同的库实现中可能会有所不同。

如果函数无法设置新的本地化,则不会更改它,并且会返回一个空指针。

示例

让我们通过一个使用 C 中的 <clocale> 头文件的 setlocale 示例来说明。

输出

The locale is: C
Date is: Wed Nov 29 17:07:13 2023
The currency symbol is: 
-
The locale is: C
Date is: Wed Nov 29 17:07:13 2023
The currency symbol is: $
-

说明

  1. 在此程序中,我们包含了几个头文件,包括用于处理与时间相关的函数的 <time.h>,用于本地化和国际化例程的 <locale.h>;以及用于输入和输出操作的 <stdio.h>。
  2. 程序声明了时间本地化操作所需的变量。Buffer_1 是一个存储格式化日期和时间的数组;time_t 是表示时间的数​​据类型;struct tm 是一个包含时间组件的结构;struct lconv 是一个存储有关格式化数字和货币值信息的结构。
  3. 使用 time 函数获取当前时间,然后使用 localtime 函数将原始时间值转换为表示本地时间的 struct tm 结构。
  4. 程序中插入了一个 do-while 循环。每次,它都会使用 LC_ALL 作为类别和 NULL 作为第二个参数调用 setlocale 来获取并打印当前本地化。
  5. 使用 strftime 函数将提供的格式("%c" 表示所选的日期和时间表示)应用于日期和时间。准备并存储在 buffer_1 中后,输出将被打印。
  6. 打印货币符号,并使用 localeconv 获取当前本地化货币格式的信息。
  7. 直到 twice_1 获得非零值,循环才会继续。每次循环后,它都会使用 setlocale(LC_ALL, "") 将本地化恢复到其默认状态。
  8. 程序通过返回 0 来结束,这表示成功执行。在第一次循环迭代中,输出将包含默认本地化的本地化、日期和时间以及货币符号。第二次循环迭代中的输出将包含用户默认本地化的确切数据。

2. Localeconv

此函数返回的对象表示当前 C 本地化的货币和数字格式化规则。与之对应的头文件是。 "c" 本地化是最小的本地化。无论如何,结果是可预测的,因为对于每个编译器,本地化都具有相同的设置。默认在所有 C 程序中使用。

语法

它具有以下语法:

它获取数量的本地化格式设置。

获取数量的本地化格式设置。

  • localeconv: 这是函数名。此标准 C 库函数返回当前 C 本地化的格式约定。
  • struct lconv*: 这是函数的返回类型。它表示函数返回指向 lconv 类型结构的指针。lconv 结构定义在 <clocale> 头文件中,并包含有关数字和货币格式信息的字段。
  • (void): 这部分表示 localeconv 函数不需要任何参数。表示函数没有参数的旧表示法是 (void)。在 C++ 中,也可以使用空的参数列表 () 来表示缺少参数。

示例

让我们通过一个使用 C 中的 localeconv 和 <clocale> 头文件的示例来说明。

输出

Local Currency Symbol: $
International Currency Symbol: USD

说明

  1. 在此示例中,我们包含了几个头文件,包括用于本地化和国际化过程的 <locale.h>,以及用于输入和输出操作的 <stdio.h>。
  2. 在此实例中,使用 setlocale 函数设置程序的本地化。用于格式化货币值的类别是 LC_MONETARY,第二个输入是空字符串 " ",表示使用用户的默认本地化。通过此函数调用,程序可以适应用户的区域设置。
  3. 一个名为 struct lconv 的结构包含有关如何格式化货币和数字值的数​​据。localeconv 函数以指向 struct lconv 类型结构的指针的形式返回当前本地化的货币格式信息。
  4. 之后,程序打印两个关于货币格式的信息。
    • lc->currency_symbol: 本地货币符号。
    • lc->int_curr_symbol: 它是国际货币符号。
  5. localeconv 函数填充了 struct lconv 结构,该结构产生这些值。
  6. 当程序最终返回 0 时,表示它已成功执行。根据用户的默认本地化,程序的输出将包括本地和外国货币符号。