jq 以科学记数法格式化小数——这可以避免吗?

jq reformatting decimals in scientific notation -- can this be avoided?

我发现 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

任何提示/建议?

您无法更改 jq 的行为 -- 目前,relevant feature requests 仍然开放 -- 但您可以 重新格式化您的号码在他们被取回之后。例如:

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"

此外,您可以使用 perl 模块 JSON::PP 重新格式化 JSON

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:...而且,可以使用 perl 来验证整个 json...:)

A commit made on Oct 21, 2019,确保 jq 通常会保留数字的 "external" 格式。有一些例外,例如多余的前导 0。

以下页面提供了有关安装 "unreleased" 版本的 jq 的详细信息:https://github.com/stedolan/jq/wiki/Installation