22.5 <locale.h> – Länderspezifische Eigenheiten
 
In ANSI C sind auch Funktionen vorhanden, die länderspezifische Eigenheiten wie bspw. 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:
Tabelle 22.3
Kategorien zur Lokalisierung der Umgebung
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 strcoll() und strxfrm()
|
LC_CTYPE
|
nur die Funktionen für die Zeichenbehandlung in ctype.h bzw. wctype.h
|
LC_MONETARY
|
die Formatierungs-Informationen für die Darstellung von Geldbeträgen (siehe localeconv())
|
LC_NUMERIC
|
das Zeichen für den Dezimalpunkt der Ein/Ausgabe und Stringkonvertierungen
|
LC_TIME
|
die Funktion strftime()
|
Für das Argument name in der Funktion setlocale() sind folgende Angaben möglich:
Tabelle 22.4
Zweites Argument für setlocale()
Angabe für name
|
Bedeutung
|
"C"
|
Keine lokalen Aspekte werden berücksichtigt.
|
""
|
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 wiederherszustellen.
|
Hierzu ein einfaches Beispiel, womit die lokale Umgebung ermittelt wird, dann 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. Dezimalpunkt oder dem Währungssymbol, 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:
struct lconv {
char* decimal_point; // Zeichen Dezimalpunkt
char* thousands_sep; // Trennzeichen für Gruppen von Ziffern
char* grouping; // Größe einer Gruppe von Ziffern
char* int_curr_symbol; // Intern. Symbol für lokale Währung
char* currency_symbol; // lokales Währungssymbol
char* mon_decimal_point; // Zeichen Dezimalpunkt b. Geldbeträge
// Trennzeichen für Gruppen von Ziffern bei Geldbeträgen
char* mon_thousands_sep;
// Größe einer Gruppe von Ziffern bei Geldbeträgen
char* mon_grouping;
char* positive_sign; // Symbol für positive Geldbeträge
char* negative_sign; // Symbol für negative Geldbeträge
/* Anzahl der Ziffern nach Dezimalpunkt von Geldbeträgen
* (international) (meistens 2) */
char int_frac_digits;
/* Anzahl der Ziffern nach Dezimalpunkt von Geldbeträgen
* (national) (meistens 2) */
char frac_digits;
/* Für positive Geldbeträge 0=Währungssymbol nach dem Betrag;
* 1=Währungssymbol vor dem Betrag */
char p_cs_precedes;
/* Für pos. Geldbeträge Leerzeichen zwischen Währungssymbol
* und dem Betrag: 1=Leerzeichen; 0=kein Leerzeichen */
char p_sep_by_space;
/* Für negative Geldbeträge 0=Währungssymbol nach dem Betrag
* 1=Währungssymbol vor dem Betrag */
char n_cs_precedes;
/* Für negative Geldbeträge. Leerzeichen zwischen
* Währungssymbol und dem Betrag: 1=Leerzeichen;
* 0=kein Leerzeichen */
char n_sep_by_space;
char p_sign_posn; // Position von positive_sign
char n_sign_posn; // Position von negative_sign
};
|