C Biblioteca estándar -<locale.h>
Introducción
<locale.h>Es un archivo de cabecera de la biblioteca estándar de C, utilizado para admitir la internacionalización y localización de programas. Proporciona un conjunto de funciones y macros para establecer o consultar la información de localización del programa, como fecha, hora, moneda, formato numérico, etc.
A continuación presentaremos algunas macros, así como una estructura importantestruct lconvy dos funciones importantes.
Macros de la biblioteca
A continuación se enumeran las macros definidas en el archivo de cabecera locale.h, que se utilizarán en las dos funciones siguientes:
| N.º | Macro y descripción |
|---|---|
| 1 | LC_ALL Se utiliza para establecer o consultar todas las categorías de localización. |
| 2 | LC_COLLATE Se utiliza para establecer o consultar la información de localización para la comparación de cadenas. |
| 3 | LC_CTYPE Se utiliza para establecer o consultar la información de localización para el procesamiento de caracteres. |
| 4 | LC_MONETARY Se utiliza para establecer o consultar la información de localización para el formato de moneda. |
| 5 | LC_NUMERIC Se utiliza para establecer o consultar la información de localización para el formato numérico (por ejemplo, el símbolo del punto decimal). |
| 6 | LC_TIME Se utiliza para establecer o consultar la información de localización para el formato de hora. |
| 7 | locale_t Representa el tipo de información de configuración regional. |
Funciones de la biblioteca
A continuación se enumeran las funciones definidas en el archivo de cabecera locale.h:
| N.º | Función y descripción |
|---|---|
| 1 | char *setlocale(int category, const char *locale) Establece o lee información de localización. |
| 2 | struct lconv *localeconv(void) Establece o lee información de localización. |
| 3 | locale_t newlocale(int category_mask, const char *locale, locale_t base) Crea un nuevo objeto de localización. |
| 4 | freelocale(locale_t locale) Libera un objeto de localización. |
| 5 | locale_t uselocale(locale_t newloc) Establece o consulta el objeto de localización del hilo. |
Ejemplo
Establecer y consultar información de localización:
Ejemplo
#include <locale.h>
int main() {
// Establecer la información de localización a la configuración predeterminada de las variables de entorno del usuario
setlocale(LC_ALL, "");
// Obtener e imprimir la información de localización actual
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;
}
El resultado de compilación y salida es:
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
Obtener información de formato numérico y de moneda:
Ejemplo
#include <locale.h>
int main() {
// Establecer la información de localización a la configuración predeterminada de las variables de entorno del usuario
setlocale(LC_ALL, "");
// Obtener la información de formato numérico y de moneda localizada
struct lconv *lc = localeconv();
// Imprimir la información de formato numérico y de moneda
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;
}
El resultado de compilación y salida es:
Decimal point character: . Thousands separator: , Currency symbol: ¥
Uso de un objeto de localización personalizado:
Ejemplo
#include <locale.h>
#include <xlocale.h>
int main() {
// Crear un nuevo objeto de localización utilizando la configuración regional "en_US.UTF-8"
locale_t newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0);
// Establecer el objeto de localización del hilo actual al nuevo objeto de localización
locale_t oldloc = uselocale(newloc);
// Obtener e imprimir la información de localización del hilo actual
printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));
// Liberar el nuevo objeto de localización
uselocale(oldloc);
freelocale(newloc);
return 0;
}
El resultado de compilación y salida es:
Current locale for LC_NUMERIC: C
Estructura de la biblioteca
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
A continuación se presentan las descripciones de cada campo:
| N.º | Campo y descripción |
|---|---|
| 1 | decimal_point Carácter de punto decimal para valores no monetarios. |
| 2 | thousands_sep Separador de miles para valores no monetarios. |
| 3 | grouping Una cadena que representa el tamaño de cada grupo de dígitos en cantidades no monetarias. Cada carácter representa un valor entero, y cada entero especifica el número de dígitos del grupo actual. Un valor de 0 significa que el valor anterior se aplicará a los grupos restantes. |
| 4 | int_curr_symbol Cadena utilizada para el símbolo de moneda internacional. Los primeros tres caracteres están especificados por ISO 4217:1987, y el cuarto carácter se utiliza para separar el símbolo de moneda y la cantidad monetaria. |
| 5 | currency_symbol Símbolo local para la moneda. |
| 6 | mon_decimal_point Carácter de punto decimal para valores monetarios. |
| 7 | mon_thousands_sep Separador de miles para valores monetarios. |
| 8 | mon_grouping Una cadena que representa el tamaño de cada grupo de dígitos en valores monetarios. Cada carácter representa un valor entero, y cada entero especifica el número de dígitos del grupo actual. Un valor de 0 significa que el valor anterior se aplicará a los grupos restantes. |
| 9 | positive_sign Carácter utilizado para valores monetarios positivos. |
| 10 | negative_sign Carácter utilizado para valores monetarios negativos. |
| 11 | int_frac_digits Número de dígitos que se mostrarán después del punto decimal en valores de moneda internacional. |
| 12 | frac_digits Número de dígitos que se mostrarán después del punto decimal en valores monetarios. |
| 13 | p_cs_precedes Si es igual a 1, currency_symbol aparece antes del valor monetario positivo. Si es igual a 0, currency_symbol aparece después del valor monetario positivo. |
| 14 | p_sep_by_space Si es igual a 1, se utiliza un espacio entre currency_symbol y el valor monetario positivo. Si es igual a 0, no se utiliza un espacio entre currency_symbol y el valor monetario positivo. |
| 15 | n_cs_precedes Si es igual a 1, currency_symbol aparece antes del valor monetario negativo. Si es igual a 0, currency_symbol aparece después del valor monetario negativo. |
| 16 | n_sep_by_space Si es igual a 1, se utiliza un espacio entre currency_symbol y el valor monetario negativo. Si es igual a 0, no se utiliza un espacio entre currency_symbol y el valor monetario negativo. |
| 17 | p_sign_posn Indica la posición del signo positivo en valores monetarios positivos. |
| 18 | n_sign_posn Indica la posición del signo negativo en valores monetarios negativos. |
Los siguientes valores se utilizan parap_sign_posnyn_sign_posn:
| Valor | Descripción |
|---|---|
| 0 | Paréntesis que encierran el valor y currency_symbol. |
| 1 | Símbolo colocado antes del valor y de currency_symbol. |
| 2 | Símbolo colocado después del valor y de currency_symbol. |
| 3 | Símbolo colocado inmediatamente antes del valor y de currency_symbol. |
| 4 | Símbolo colocado inmediatamente después del valor y de currency_symbol. |