it-swarm.com.de

Welches ist das aktuelle Dezimaltrennzeichen?

Angenommen, ich habe ein POSIX-Shell-Skript, das

  1. muss auf verschiedenen Systemen/Umgebungen ausgeführt werden, die ich nicht kontrolliere, und
  2. 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?

29
gboffi

Fragen Sie locale :

locale decimal_point

Dadurch wird der Dezimalpunkt unter Verwendung der aktuellen Gebietsschemaeinstellungen ausgegeben.

Wenn Sie das Tausendertrennzeichen benötigen:

locale thousands_sep
43
Stephen Kitt

Wenn dies ein zsh Shell-Skript ist, können Sie das spezielle assoziative Array $langinfo Im Modul zsh/langinfo Verwenden:

zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]

(das dem Standard nl_langinfo(RADIXCHAR) zugeordnet ist, siehe man nl_langinfo auf Ihrem System für Details; $langinfo[THOUSEP] für das Tausendertrennzeichen).

In einem bash -Skript (würde auch in zsh funktionieren) sollten Sie in der Lage sein, es abzurufen, ohne einen separaten Prozess mit dem integrierten printf zu forken:

printf -v radix %.1f 1 && radix=${radix:1:1}

Um eine Zahl aus dem Gebietsschemaformat des Benutzers in das Gebietsschemaformat C mit der ksh93-Shell zu konvertieren, gehen Sie wie folgt vor:

$ locale title
German locale for Germany
$ x=1.123.456,78 ksh -c 'typeset -F x="$x"; LC_ALL=C; printf "%.23g\n" "$x"'
1123456.78
6