Angenommen, ich habe ein POSIX-Shell-Skript, das
- muss auf verschiedenen Systemen / Umgebungen ausgeführt werden, die ich nicht kontrolliere, und
- muss das Dezimaltrennzeichen aus einer Zeichenfolge entfernen, die von einem Programm ausgegeben wird, das die Gebietsschemaeinstellungen berücksichtigt.
Wie kann ich das Dezimaltrennzeichen am allgemeinsten erkennen?
shell
posix
locale
floating-point
gboffi
quelle
quelle
tcsh
gesagt, ich habe vergessen, dass ich in ... verwendet habe, oh mein Gott, du kannst definitiv sagen, dass ich ALT bin !!!LC_ALL=C
Umgebung ausführen ?Antworten:
Fragen Sie
locale
:Dadurch wird der Dezimalpunkt mit den aktuellen Gebietsschemaeinstellungen ausgegeben.
Wenn Sie das Tausendertrennzeichen benötigen:
quelle
locale
von der GNUlibc
,locale -k LC_NUMERIC
um alle Gebietsschemaeinstellungen in der Kategorie LC_NUMERIC aufzulisten.printf "%'f"
würde es tun, fürprintf
Implementierungen, die unterstützen%f
.printf
und einige Shell (z. B.dash
) unterstützen keine internationalisierte Ausgabe. In einer anderen Antwort erklärte Stéphane Chazelas in einem Kommentar , dass es von POSIXlocale
nicht unterstützt wird.Wenn es sich um ein
zsh
Shell-Skript handelt, können Sie das$langinfo
spezielle assoziative Array in derzsh/langinfo
Modul verwenden:(das entspricht dem Standard
nl_langinfo(RADIXCHAR)
, sieheman nl_langinfo
Details finden auf Ihrem System;$langinfo[THOUSEP]
das Tausendertrennzeichen).In einem
bash
Skript (würde auch funktionierenzsh
) sollten Sie in der Lage sein, esprintf
abzurufen, ohne einen separaten Prozess mit dem eingebauten Befehl zu forken:Um eine Zahl aus dem Gebietsschema-Format des Benutzers in das C-Gebietsschema-Format zu konvertieren, können Sie mit der ksh93-Shell wie folgt vorgehen:
quelle
tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
printf
Implementierungen funktionieren, die dies unterstützen%f
, aber nicht in allen.%f
Support wird von POSIX nicht verlangt. Dieprintf
vondash
zum Beispiel verwendet immer.
dash
nicht internationalisiert ... Ich habe gerade festgestellt , dass ... so die allgemeinste Lösung zurückgreiftlocale decimal_point
, nicht wahr?awk
kann Zahlen im aktuellen Gebietsschema auch im POSIX-Modus interpretieren (behandelt jedoch nicht das Tausendertrennzeichen).