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
1char *setlocale(int category, const char *locale)
Establece o lee información de localización.
2struct lconv *localeconv(void)
Establece o lee información de localización.
3locale_t newlocale(int category_mask, const char *locale, locale_t base)
Crea un nuevo objeto de localización.
4freelocale(locale_t locale)
Libera un objeto de localización.
5locale_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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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:

ValorDescripció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.
Otras extensiones