Siirry sisältöön

C/Standardikirjastot/locale.h

Wikikirjastosta
#include <locale.h>

Sisältää maa-asetusten käyttöön liittyviä asioita.

Maa-asetukset ovat yksi C-kirjaston hankalimpia osia, sillä ne aiheuttavat usein ongelmia ulkoisten kirjastojen kanssa. Tämän lisäksi maa-asetukset määritellään standardissa ohjelmanlaajuisesti, joten ne aiheuttavat pulmia myös monisäikeisten ohjelmien kanssa. Viisainta lieneekin monimutkaisemmissa ohjelmissa olla käyttämättä C:n maa-asetuksia lainkaan ja antaa kaiken käyttää oletusasetuksia.

Oletusmaa-asetukset ovat niin sanotut "C-asetukset" (engl. C locale).

struct lconv

on tietue, joka sisältää lukujen esittämiseen liittyviä tietoja. Siinä on (ainakin) seuraavat kentät:

char *decimal_point;       /* desimaalierotin                                 C-asetuksilla "." */
char *thousands_sep;       /* tuhaterotin                                     C-asetuksilla "" */
char *grouping;            /* numeroiden ryhmittely                           C-asetuksilla "" */
char *int_curr_symbol;     /* rahayksikön kansainvälinen koodi                C-asetuksilla "" */
char *currency_symbol;     /* rahayksikön merkki                              C-asetuksilla "" */
char *mon_decimal_point;   /* desimaalierotin rahamäärissä                    C-asetuksilla "" */
char *mon_thousands_sep;   /* tuhaterotin rahamäärissä                        C-asetuksilla "" */
char *mon_grouping;        /* numeroiden ryhmittely rahamäärissä              C-asetuksilla "" */
char *positive_sign;       /* positiivinen etumerkki rahamäärissä             C-asetuksilla "" */
char *negative_sign;       /* negatiivinen etumerkki rahamäärissä             C-asetuksilla "" */
char int_frac_digits;      /* desimaalien lukumäärä kans.väl. rahamäärissä    C-asetuksilla CHAR_MAX */
char frac_digits;          /* desimaalien lukumäärä rahamäärissä              C-asetuksilla CHAR_MAX */
char p_cs_precedes;        /* onko rahayksikön merkki edellä, kun määrä >= 0  C-asetuksilla CHAR_MAX */
char p_sep_by_space;       /* onko rahayksikön merkki edellä, kun määrä <  0  C-asetuksilla CHAR_MAX */
char n_cs_precedes;        /* onko rahayksikön merkillä väli, kun määrä >= 0  C-asetuksilla CHAR_MAX */
char n_sep_by_space;       /* onko rahayksikön merkillä väli, kun määrä <  0  C-asetuksilla CHAR_MAX */
char p_sign_posn;          /* etumerkin paikka rahamäärissä kun määrä >= 0    C-asetuksilla CHAR_MAX */
char n_sign_posn;          /* etumerkin paikka rahamäärissä kun määrä < 0     C-asetuksilla CHAR_MAX */

grouping ja mon_grouping ovat merkkijonoja, jossa merkin koodi ilmaisee numeroiden määrän; esim "\1\2\3" tarkoittaa, että numerot ryhmitellään oikealta 1 numeron, 2 numeron ja sen jälkeen 3 numeron ryhmiin (123 456 87 9). Tyhjä merkkijono ilmaisee, ettei numeroita ryhmitellä lainkaan.

*_sign_posn on 0, jos rahayksikön merkki ja määrä on suluissa, 1 jos etumerkki on ennen merkkiä ja määrää, 2 jos niiden jälkeen, 3 jos etumerkki on juuri ennen rahayksikön merkkiä, 4 jos juuri sen jälkeen.

char-tyyppisten kenttien arvo on CHAR_MAX, jos arvo on tuntematon.

Lisäksi määritellään makrot

LC_ALL
LC_COLLATE
LC_CTYPE
LC_MONETARY
LC_NUMERIC
LC_TIME

jotka vastaavat maa-asetuksia tietyin osin (kaikki osat, merkkien järjestys, merkkien luokittelu, rahamäärien esittäminen, lukujen esittäminen, päivämäärät ja kellonajat).

char *setlocale(int luokka, const char *asetukset);

vaihtaa tai tarkistaa maa-asetukset. luokka on jokin LC_:llä alkavista makroista. Jos asetus on NULL, maa-asetusta ei muuteta. Jos se on tyhjä merkkijono, otetaan käyttöön järjestelmän oletusasetukset. Jos se on merkkijono, jossa on vain kirjain C, otetaan käyttöön C-asetukset. Muussa tapauksessa järjestelmä säätää, mikä oikea muoto on.

Funktio palauttaa merkkijonon, joka vastaa nykyisiä maa-asetuksia. Jos maa-asetuksia yrittää muuttaa ja tämä epäonnistuu, setlocale palauttaa NULL:in.

struct lconv *localeconv(void);

palauttaa sisäisessa puskurissa olevan struct lconv -tietueen, joka täytetään nykyisten maa-asetusten mukaisesti.