Вы можете использоватьawk
:
#! /bin/sh -
x=5678 y=1000
awk -- 'BEGIN{printf "%.3f\n", ARGV[1]/ARGV[2]}' "$x" "$y"
Будете ли вы получать 5.678
или 5,678
, будет зависеть от локали ($LC_ALL
, $LC_NUMERIC
, $LANG
переменных )и реализации awk
(, некоторые из которых будут использовать .
независимо от региона ).
В реализации GNU awk
вам необходимо передать переменную POSIXLY_CORRECT
в ее окружение, чтобы она учитывала локаль для десятичного символа системы счисления.
Это также относится к входным числам:
$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
printf "%.3f\n", ARGV[1]/ARGV[2]}' 1,2 10
0,120
$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
printf "%.3f\n", ARGV[1]/ARGV[2]}' 1.2 10
0,100
(в этом последнем случае 1.2
интерпретировалось как 1
, потому что при явном преобразовании строки в число (, как при использовании арифметического оператора /
здесь ), awk
анализирует как можно большую часть строки, если она составляет допустимое число, а остальное игнорирует. Это .2
не понимается в этой французской локали, поскольку десятичная система счисления там ,
, а не.
).
--
, чтобы отметить конец опций, необходим в реализации busybox awk
, которую вы, кажется, используете, поскольку она принимает опции после аргументов опций, отличных от -, что делает ее не -POSIX. совместимый. Без него вышеуказанное не сработало бы, если бы $x
или $y
были отрицательными числами.
В качестве альтернативы, вы можете снова установить $POSIXLY_CORRECT
, что заставит его анализировать свои параметры стандартным способом. Отметим, что в любом случаеbusybox awk
всегда использует .
в качестве десятичного символа системы счисления независимо от локали и независимо от $POSIXLY_CORRECT
.