20.5 <locale.h> – länderspezifische Eigenheiten 

In ANSI C sind auch Funktionen vorhanden, die länderspezifische Eigenheiten wie beispielsweise die Formatierung von Geldbeträgen beachten. Dabei handelt es sich um zwei Funktionen und mehrere Makros, die recht selten Beachtung finden.
Wenn Sie ein Programm starten, werden die lokalen Aspekte zunächst nicht berücksichtigt und das Programm wird somit mit den Standard-Einstellungen der Umgebung gestartet.
Die Funktion, mit der Sie ein Programm mit den lokalen Eigenheiten zur Laufzeit anpassen können, lautet:
#include <locale.h> char *setlocale( int kategorie, const char *name );
Manchmal will man nicht die kompletten lokalen Aspekte berücksichtigen, daher wurde die Kategorie (erstes Argument) folgendermaßen aufgeteilt:
Kategorie | Betroffen davon im Programm |
LC_ALL |
Alle lokalen Aspekte (die gleich noch in der Kategorie folgen) werden berücksichtigt. |
LC_COLLATE |
nur die Funktionen zum Vergleichen von Strings, strcoll() und wcscoll() |
LC_CTYPE |
nur die Funktionen für die Zeichenklassifizierung und -umwandlung in <ctype.h> bzw. <wctype.h> |
LC_MONETARY |
die Formatierungsinformationen für die Darstellung von Geldbeträgen (siehe auch localeconv()) |
LC_NUMERIC |
das Zeichen für den Dezimalpunkt der Ein-/Ausgabe und Stringkonvertierungen |
LC_TIME |
die Funktionen zur Formatierung des Datums strftime() und wcsftime() |
Für das Argument name in der Funktion setlocale() sind folgende Angaben möglich:
Angabe für »name« | Bedeutung |
"C" |
Keine lokalen Aspekte werden berücksichtigt. |
"" |
Die Einstellung richtet sich nach der Umgebung des Compilers. |
NULL |
Die lokale Umgebung wird nicht verändert. Wird verwendet, um mithilfe des Rückgabewertes von setlocale() die alte Umgebung zu sichern und eventuell wiederherzustellen. |
Hierzu folgt ein einfaches Beispiel, mit dem die lokale Umgebung ermittelt und anschließend entsprechend dem Einsatzgebiet des Compilers verändert und zum Schluss wiederhergestellt wird.
/* my_setlocale.c */ #include <stdio.h> #include <locale.h> #define KOMMA 3.3223 int main(void) { char *local_save = setlocale(LC_ALL, NULL); char *local; printf("Lokale Umgebung: %s (Standard)\n", local_save); printf("Gleitpunkt: %f\n",KOMMA); local = setlocale( LC_ALL, ""); printf("Neue lokale Umgebung: %s\n", local); printf("Gleitpunkt: %f\n",KOMMA); printf("Standard-Umgebung wiederherstellen\n"); local = setlocale( LC_ALL, local_save); printf("Lokale Umgebung: %s (wiederhergestellt)\n", local); return 0; }
Benötigen Sie außerdem Informationen für die Formatierung von numerischen Werten wie z. B. des Dezimalpunkts oder des Währungssymbols, steht Ihnen noch folgende Funktion zur Verfügung:
#include <locale.h> struct lconv *localeconv( void );
Die Funktion füllt eine Struktur namens lconv mit der aktuell gesetzten länderspezifischen Umgebung. Diese Struktur beinhaltet folgende Mitglieder:
Elemente in struct lconv | Beschreibung |
char* decimal_point; |
Zeichen für einen Dezimalpunkt nicht-monetärer Werte. |
char* thousands_sep; |
Trennzeichen für Gruppen von Ziffern. Einige Umgebungen fassen Ziffern in Tausendergruppen zusammen. (Beispielsweise ist das Trennzeichen ein Komma: "66,666".) |
char* grouping; |
Größe einer Gruppe von Ziffern |
char* int_curr_symbol; |
internationales Symbol für lokale Währung |
char* currency_symbol; |
lokales Währungssymbol |
char* mon_decimal_point; |
Zeichen für den Dezimalpunkt bei Geldbeträgen |
char* mon_thousands_sep; |
Trennzeichen für (Tausender-)Gruppen von Ziffern bei Geldbeträgen |
char* mon_grouping; |
Größe einer Gruppe von Ziffern bei Geldbeträgen |
char* positive_sign; |
Symbol für positive Geldbeträge |
char* negative_sign; |
Symbol für negative Geldbeträge |
char int_frac_digits; |
Anzahl der Ziffern nach Dezimalpunkt von Geldbeträgen (international) (meistens 2) |
char frac_digits; |
Anzahl der Ziffern nach Dezimalpunkt von Geldbeträgen (national) (meistens 2) |
char p_cs_precedes; |
Für positive Geldbeträge: 0 = Währungssymbol nach dem Betrag 1 = Währungssymbol vor dem Betrag |
char int_p_cs_precedes; |
(C99) internationale Version von p_cs_precedes |
char p_sep_by_space; |
Für positive Geldbeträge: Leerzeichen zwischen Währungssymbol und dem Betrag: 1 = Leerzeichen 0 = kein Leerzeichen |
char int_p_sep_by_space; |
(C99) Internationale Version von p_sep_by_space |
char n_cs_precedes; |
Für negative Geldbeträge: 0 = Währungssymbol nach dem Betrag 1 = Währungssymbol vor dem Betrag |
char int_n_cs_precedes; |
(C99) Internationale Version von n_cs_precedes |
char n_sep_by_space; |
Für negative Geldbeträge: Leerzeichen zwischen Währungssymbol und dem Betrag: 1 = Leerzeichen 0 = kein Leerzeichen |
char int_n_sep_by_space; |
(C99) internationale Version von n_sep_by_space |
char p_sign_posn; |
Position von positive_sign |
char int_p_sign_posn; |
(C99) internationale Version von p_sign_posn |
char n_sign_posn; |
Position von negative_sign |
char int_n_sign_posn; |
(C99) internationale Version von n_sign_posn |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.