函数
<clocale>

setlocale

char* setlocale (int category, const char* locale);
设置或获取本地化信息
为当前程序设置要使用的本地化信息,可以更改整个区域设置或其中的一部分。该函数也可用于获取当前区域设置的名称,只需将 NULL 作为 locale 参数的值传递即可。

区域设置包含有关如何解释和执行某些输入/输出和转换操作的信息,其中考虑了特定于位置和语言的设置。

大多数运行环境已根据用户偏好或本地化设置了某些区域信息。但是,与此系统区域设置无关,在启动时,所有 C 程序都设置了 "C" 区域设置,这是一个相当中立的区域设置,具有最少的本地化信息,使得程序的运行结果是可预测的。为了使用环境中设置的默认区域设置,可以调用此函数并以 "" 作为 locale 参数。

程序启动时,选择的区域设置是 "C" locale,这与调用 setlocale(LC_ALL,"C") 所设置的相同。

通过调用 setlocale(LC_ALL,"") 可以选择环境中设置的区域设置。

调用此函数所影响的当前区域设置部分由 category 参数指定。

参数

类别
受影响的区域设置部分。它是 <clocale> 中定义为宏的以下常量值之一
受影响的区域设置部分
LC_ALL整个区域设置。
LC_COLLATE影响 strcollstrxfrm 的行为。
LC_CTYPE影响字符处理函数(<cctype> 中的所有函数,除了 isdigitisxdigit),以及多字节和宽字符函数。
LC_MONETARY影响由 localeconv 返回的货币格式化信息。
LC_NUMERIC影响格式化输入/输出操作和字符串格式化函数中的小数点字符,以及由 localeconv 返回的非货币信息。
LC_TIME影响 strftime 的行为。
locale
包含 C 区域设置名称的 C 字符串。这些是系统特定的,但至少必须存在以下两个区域设置
区域设置名称描述
"C"最小 "C" 区域设置
""环境的默认区域设置
如果此参数的值为 NULL,则该函数不会对当前区域设置进行任何更改,但仍会返回当前区域设置的名称。

返回值

成功时,返回一个指向 C 字符串的指针,该字符串标识当前为 category 设置的区域设置。如果 categoryLC_ALL 并且区域设置的不同部分被设置为不同的值,则返回的字符串以一种可能因库实现而异的格式提供此信息。

如果函数未能设置新的区域设置,则此项不会被修改,并返回一个空指针。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* setlocale example */
#include <stdio.h>      /* printf */
#include <time.h>       /* time_t, struct tm, time, localtime, strftime */
#include <locale.h>     /* struct lconv, setlocale, localeconv */

int main ()
{
  time_t rawtime;
  struct tm * timeinfo;
  char buffer [80];

  struct lconv * lc;

  time ( &rawtime );
  timeinfo = localtime ( &rawtime );

  int twice=0;

  do {
    printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) );

    strftime (buffer,80,"%c",timeinfo);
    printf ("Date is: %s\n",buffer);

    lc = localeconv ();
    printf ("Currency symbol is: %s\n-\n",lc->currency_symbol);

    setlocale (LC_ALL,"");
  } while (!twice++);

  return 0;
}

运行上述代码时,可能的输出之一是
Locale is: C
Date is: 01/15/07 13:33:47
Currency symbol is: 
-
Locale is: English_United States.1252
Date is: 1/15/07 1:33:47 PM
Currency symbol is: $
-


数据竞争

更改区域设置可能会与对同一函数或受区域设置影响的任何 C 库函数的并发调用产生数据竞争。

异常 (C++)

无异常保证:此函数从不抛出异常。

另见