Преобразование пары (целое число, точность) в число с плавающей запятой в bash/bc

У меня есть два числа: $value и $precision. Мне нужно сделать представление этих чисел с плавающей запятой (хотя, конечно, на выходе будет строка, так как это bash).

$precision сообщает мне, сколько десятичных знаков должно быть в числе.

Пример:

  $value=123, $precision=2

Это должно дать результат «1,23».

Как я могу сделать это элегантно из Bash? Я смотрю на справочную страницу "bc", но на самом деле я не вижу там никакого пути. Я предполагаю, что самый простой способ - обработать мое входное значение как строку и вставить char '.' в правильном положении как-то.


person Jolta    schedule 31.08.2012    source источник


Ответы (2)


Итак, я нашел некоторую помощь по работе со строками для Bash ... Это помогает, но вряд ли это красиво. Выкладываю сюда для потомков.

lastIndex=$((${#value}-1))
dotIndex=$((${#value}-$precision))
decvalue=${value:0:$dotIndex}.${value:$dotIndex:$lastIndex}
person Jolta    schedule 31.08.2012
comment
Вам действительно не нужны обратные галочки или эхо; вы можете использовать только: decvalue="${value:0:$precision}.${value:$last}", где двойные кавычки также необязательны. Кроме того, разве это не дает 12.3, а не 1.23? - person Jonathan Leffler; 31.08.2012
comment
Спасибо! Мое выражение было ошибочным и на самом деле дало мне 1,3 ... Но теперь оно дает мне 12,3, как вы говорите. Любые предложения, чтобы изменить это? - person Jolta; 31.08.2012
comment
Хорошо, я думаю, что это делает свое дело. Но это некрасиво! С другой стороны, весь мой скрипт выполняется примерно за 0,190 с с использованием решения sed и примерно за 0,180 с с использованием этого уродливого решения! ;-) - person Jolta; 31.08.2012
comment
Что ж, надеюсь, вы сможете с пользой использовать лишние 1/100 секунды каждый раз, когда используете этот скрипт :) Ваша исправленная версия выглядит так, как я собирался собрать. Я отмечаю, что bash может извлечь пользу из изучения Perl, что отрицательные смещения, означающие «от конца строки», могут быть удобны (это сэкономит вам часть этих вычислений). - person Jonathan Leffler; 31.08.2012
comment
Ну, если я запускаю скрипт n раз в минуту... это все равно будет O(n). Неважно. - person Jolta; 01.09.2012

person    schedule
comment
Я выберу решение sed, по крайней мере, я могу его прочитать и понять. Выражение bc дает мне следующую ошибку в Solaris 10: синтаксическая ошибка в строке 1, телетайп - person Jolta; 31.08.2012
comment
@Jolta: извините, у меня завис мозг во время тестирования, и я удалил '=' из строки 'scale' как попытку исправления (прежде чем я понял, что не буду устанавливать переменные bash, если вам нужно знать ). И я не исправил его, прежде чем нажать «Отправить». - person Jonathan Leffler; 31.08.2012