Допустим, у меня есть несколько чисел с плавающей запятой для печати в скрипте Bash.Но я хочу, чтобы числа с плавающей запятой отображались в соответствии с переменной среды LC_NUMERIC
.
#!/usr/bin/env bash
declare -r light_speed=299792458
declare -r pi=3.1415926535897932384626433
# Do it in US's English
LC_NUMERIC=en_US.UTF8
printf 'LC_NUMERIC=%s\n' "${LC_NUMERIC}"
printf 'Speed of light in vacuum is:\nC=%.f m/s\n\nπ=%.10f\n' \
"${light_speed}" \
"${pi}"
echo $'\n'
# Do it in France's French
# it fails because floating point format
# changes for printf parameters
LC_NUMERIC=fr_FR.UTF8
printf 'LC_NUMERIC=%s\n' "${LC_NUMERIC}"
printf 'La vitesse de la lumière dans le vide est :\nC=%.f m/s\n\nπ≈%.10f\n' \
"${light_speed}" \
"${pi}"
Вывод:
LC_NUMERIC=en_US.UTF8
Speed of light in vacuum is:
C=299792458 m/s
π≈3.1415926536
LC_NUMERIC=fr_FR.UTF8
La vitesse de la lumière dans le vide est :
C=299792458 m/s
a.sh: line 20: printf: 3.1415926535897932384626433: invalid number
π≈3,0000000000
Это вполне ожидаемый результат, поскольку printf
%f
format ожидает, что аргумент будет отформатирован в соответствии с LC_NUMERIC
.
Тогда как вы отображаете произвольные числа с плавающей запятой, которые хранятся в формате POSIX или bc
, но отображение отображает настройки LC_NUMERIC
?
Что если я хочу французскую часть кода со следующим выводом?
La vitesse de la lumière dans le vide est :
C=299792458 m/s
π≈3,1415926536