web-dev-qa-db-fra.com

Quel est le séparateur décimal actuel?

Disons que j'ai un script Shell POSIX qui

  1. doit fonctionner sur différents systèmes/environnements que je ne contrôle pas, et
  2. doit supprimer le séparateur décimal d'une chaîne émise par un programme qui respecte les paramètres régionaux.

Comment détecter le séparateur décimal de la manière la plus générale?

29
gboffi

Demandez locale :

locale decimal_point

Cela produira le point décimal en utilisant les paramètres régionaux actuels.

Si vous avez besoin du séparateur de milliers:

locale thousands_sep
43
Stephen Kitt

S'il s'agit d'un script Shell zsh, vous pouvez utiliser le tableau associatif spécial $langinfo Dans le module zsh/langinfo:

zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]

(qui correspond à la nl_langinfo(RADIXCHAR) standard, voir man nl_langinfo sur votre système pour plus de détails; $langinfo[THOUSEP] pour le séparateur de milliers).

Dans un script bash (qui fonctionnerait également dans zsh), vous devriez pouvoir l'obtenir sans bifurquer un processus séparé en utilisant le module intégré printf:

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

Pour convertir un nombre du format de paramètres régionaux de l'utilisateur au format de paramètres régionaux C, avec le shell ksh93, vous pouvez le faire comme suit:

$ 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
Stéphane Chazelas