C/Appendice/Librerie standard/locale.h

Indice del libro

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

modifica

La 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

modifica
decimal_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

modifica

La 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.