JQ переформатирование десятичных знаков в научной записи - можно ли этого избежать?
Я нашел разницу между JSON-данными, созданными JavaScipt и через jq
с bash (и другими языками программирования). С помощью JavaScript я могу создавать десятичные числа до шести цифр после точки, даже когда я использую float()
, Но с jq
Он отличается, потому что добавление десятичного значения занимает четыре цифры только после десятичной точки.
Моя проблема в том, что мне нужны десятичные числа для хранения в SQL, до шести цифр после запятой.
Пример:
$ JSON='{"decimal":0.00001}'
$ echo "$JSON" | jq .
{
"decimal": 1e-05
}
Моя цель - подтвердить десятичность с помощью этой строки...
if [[ "$TMP_DECIMAL" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then
Любой совет / suggsestion?
2 ответа
Вы не можете изменить jq
Поведение - в настоящее время запросы на соответствующие функции по-прежнему открыты - но вы можете переформатировать свои номера после того, как они были получены. Например:
json='{"decimal":0.00001}'
decimal=$(jq '.decimal' <<<"$json")
decimal_f=$(awk -v decimal="$decimal" 'BEGIN { printf("%f\n", decimal) }' </dev/null)
echo "JQ emitted $decimal; reformatted as $decimal_f"
Кроме того, вы можете переформатировать JSON
используя модуль Perl JSON:: PP.
perl -0777 -MJSON::PP -E '$s=<>; $j=JSON::PP->new->ascii->pretty->allow_nonref->allow_bignum;$p=$j->decode($s);say $j->encode($p)'
или лучше:
perl -0777 -MJSON::PP -E '
$j=JSON::PP->new->ascii->pretty->allow_nonref->allow_bignum;
$p=$j->decode(<>);
say $j->encode($p)'
Решающим является allow_bignum
,
Пример:
echo '{"decimal":0.00000001}' | perl ....
печать
{
"decimal" : 0.00000001
}
но без allow_bignum
печать
{
"decimal" : 1e-08
}
PS: ... а также, можно проверить весь JSON с помощью Perl...:)
Фиксация, сделанная 21 октября 2019 г., гарантирует, что jq обычно сохранит "внешний" формат чисел. Есть некоторые исключения, например, лишние ведущие нули.
На следующей странице приведены подробные сведения об установке "невыпущенной" версии jq: https://github.com/stedolan/jq/wiki/Installation