Disons que j'ai un script shell POSIX qui
- doit fonctionner sur différents systèmes / environnements que je ne contrôle pas, et
- 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?
shell
posix
locale
floating-point
gboffi
la source
la source
tcsh
dans ..., oh mon Dieu, vous pouvez certainement dire que je suis vieux !!!LC_ALL=C
environnement?Réponses:
Demandez
locale
:Cela produira le point décimal en utilisant les paramètres régionaux actuels.
Si vous avez besoin du séparateur de milliers:
la source
locale
du GNUlibc
,locale -k LC_NUMERIC
pour lister tous les paramètres régionaux dans la catégorie LC_NUMERIC.printf "%'f"
ferait, pour lesprintf
implémentations qui prennent en charge%f
.printf
et certains shell (par exemple,dash
) ne prennent pas en charge la sortie internationalisée. Dans une autre réponse Stéphane Chazelas a expliqué, dans un commentaire , que ce n'est pas requis par POSIXlocale
n'est pas prise en charge.S'il s'agit d'un
zsh
script shell, vous pouvez utiliser le$langinfo
tableau associatif spécial duzsh/langinfo
module:(qui correspond à la norme
nl_langinfo(RADIXCHAR)
, voirman nl_langinfo
sur votre système pour plus de détails;$langinfo[THOUSEP]
pour le séparateur de milliers).Dans un
bash
script (fonctionnerait également danszsh
), vous devriez pouvoir l'obtenir sans bifurquer un processus séparé en utilisant leprintf
builtin:Pour convertir un nombre du format local de l'utilisateur au format local C, avec le shell ksh93, vous pouvez le faire comme:
la source
tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
printf
implémentations internationalisées qui prennent en charge%f
, mais pas toutes.%f
le support n'est pas mandaté par POSIX. Leprintf
ofdash
utilise par exemple toujours.
dash
pas internationalisé ... Je viens de découvrir que ... donc la solution la plus générale est de recourir àlocale decimal_point
, non?awk
peut également interpréter les nombres dans les paramètres régionaux actuels avec le mode POSIX (ne gère pas le séparateur de milliers cependant).