C/Appendice/Librerie standard/locale.h
L'header locale.h è utile per impostare informazioni specifiche. Sono definite la struttura lconv e le costanti NULL, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC,LC_TIME e le funzioni: localeconv(),setlocale();
Struttura lconv e uso
modificaLa struttura lconv è così definita
struct lconv {
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;
}
Tale struttura è usata da localeconv() così definita
struct lconv *localeconv(void);
Essa imposta la struttura lconv alle impostazioni locali correnti. I puntatori a stringa nella struttura possono puntare a una stringa nulla che indica che il valore non è disponibile. I tipi char sono numeri non negativi. Se il valore è CHAR_MAX, allora il valore non è disponibile.
Descrizione membri della struttura
modificadecimal_point | Carattere punto decimale per valori non monetari. |
thousands_sep | Separatore migliaia utilizzato per i non-valori monetari. |
grouping | Una stringa che indica la dimensione di ciascun gruppo di cifre di quantità non monetarie. Ogni carattere rappresenta un valore intero che indica il numero di cifre nel gruppo corrente. Il valore 0 significa che il valore precedente, deve essere utilizzato per il resto dei gruppi. |
int_curr_symbol | la stringa utilizzata per i simboli internazionali di valuta. |
currency_symbol | Il simbolo locale utilizzato per la valuta. |
mon_decimal_point | Carattere punto decimale usato per i valori monetari. |
mon_thousands_sep | Carattere raggruppamento migliaia per i valori monetari. |
mon_grouping | Una stringa i cui elementi definiscono le dimensioni del gruppo di cifre per i valori monetari. Ogni carattere rappresenta un valore intero che indica il numero di cifre nel gruppo corrente. Il valore 0 significa che il valore precedente, deve essere utilizzato per il resto dei gruppi. |
positive_sign | carattere da usare per il segno positivo nei valori monetari. |
negative_sign | carattere per il segno negativo nei valori monetari. |
int_frac_digits | numero di cifre decimali dopo il punto decimale nei valori monetari internazionali. |
frac_digits | numero di cifre decimali dopo il punto decimale nei valori monetari. |
p_cs_precedes | Se uguale a 1, allora currency_symbol appare prima di un valore monetario positivo. Se uguale a 0, currency_symbol appare dopo un valore monetario positivo. |
p_sep_by_space | Se uguale a 1, allora currency_symbol è separata da uno spazio da un valore monetario positivo. Se uguale a 0, allora non c'è spazio tra currency_symbol e un valore monetario positivo. |
n_cs_precedes | Se uguale a 1, il currency_symbol precede un valore monetario negativo. Se uguale a 0, il currency_symbol segue un valore monetario negativo. |
n_sep_by_space | Se uguale a 1, allora currency_symbol è separato da uno spazio da un valore negativo monetario. Se uguale a 0, allora non c'è spazio tra currency_symbol e un valore monetario negativo. |
p_sign_posn | Rappresenta la posizione di positive_sign in un valore monetario positivo. |
n_sign_posn | Rappresenta la posizione di negative_sign in un valore monetario negativo. |
Esempio
modifica#include<locale.h>
#include<stdio.h>
int main(void)
{
struct lconv *ptrLocale = localeconv();
printf("Punto decimale: %s", ptrLocale->decimal_point);
printf("Separatore migliaia: %s", ptrLocale->thousands_sep);
printf("Raggruppamento: %s", ptrLocale->grouping);
printf("Simbolo valuta internazionale: %s", ptrLocale->int_curr_symbol);
printf("Simbolo valuta: %s", ptrLocale->currency_symbol);
printf("Punto decimale monetario: %s", ptrLocale->mon_decimal_point);
printf("Separatore migliaia monetario: %s", ptrLocale->mon_thousands_sep);
printf("Raggruppamento monetario: %s", ptrLocale->mon_grouping);
printf("Segno positivo monetario: %s", ptrLocale->positive_sign);
printf("Segno negativo monetario: %s", ptrLocale->negative_sign);
return 0;
}
setlocale definizione e uso
modificaLa funzione setlocale() definita:
char *setlocale(int category, const char *locale);
imposta o legge le informazioni dipendenti dalla località. category può essere una delle seguenti:
LC_ALL | imposta tutto. |
LC_COLLATE | agisce sulle funzioni strcoll e strxfrm. |
LC_CTYPE | agisce su tutte le funzioni per i caratteri. |
LC_MONETARY | agisce sulle informazioni monetarie fornite da localeconv. |
LC_NUMERIC | agisce sulla formattazione del punto decimale e sulle informazioni fornite da localeconv. |
LC_TIME | agisce sulla funzione strftime. |
Il valore "C" per locale mette le impostazioni di base del C. Una stringa vuota ("") per locale definisce le impostazioni native d'ambiente. Un puntatore nullo (NULL) fa restituire a setlocale un puntatore alla stringa associata alla categoria per le impostazioni correnti (non si verificano dei cambiamenti). Se il cambiamento ha successo, setlocale restituisce un puntatore a una stringa che rappresenta l'impostazione precedente. In caso di fallimento restituisce NULL.
Esempio
modifica#include<locale.h>
#include<stdio.h>
int main(void)
{
char *ptrOldLocale;
ptrOldLocale=setlocale(LC_ALL,"C");
printf("Le impostazioni precedenti erano %s.\n",ptrOldLocale);
return 0;
}
Esempio: Scrivere correttamente lettere localizzate
modifica#include <stdio.h>
#include <locale.h>
int main (void)
{
setlocale(LC_CTYPE,"");
printf("Lettere accentate: àèéìòù");
return 0;
}
La costante LC_CTYPE indica che si vuol agire sui caratteri, mentre "" indica alla funzione di impostare la localizzazione a quella definita per il sistema, di conseguenza per un sistema operativo localizzato in italiano le lettere si dovrebbero leggere correttamente.