Как отформатировать число с плавающей точкой для отображения на основе переменных среды локали? - PullRequest
5 голосов
/ 06 июля 2019

Допустим, у меня есть несколько чисел с плавающей запятой для печати в скрипте 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

1 Ответ

4 голосов
/ 06 июля 2019

Это проблема с собственной встроенной командой Bash printf. Автономный принтер работает нормально.

LC_NUMERIC=fr_FR.UTF8     printf 'Bad  : %f\n' 3.14
env LC_NUMERIC=fr_FR.UTF8 printf 'Good : %f\n' 3.14

выход

script.sh: line 4: printf: 3.14: invalid number
Bad  : 0,000000
Good : 3,140000
...