JQ在科学记数法中重新格式化小数 - 这可以避免吗?



我发现JavaScipt创建的json-data与bash(和其他编程语言(通过jq创建json-data之间存在差异。使用 JavaScript,我可以创建十进制数,点后最多有六位数字,即使我使用 float() .但随着jq它的不同,因为添加十进制值只需要小数点后的四位数字。

我的问题是我需要十进制数字才能存储在 SQL 中,点后最多有六位数字。

例:

$ JSON='{"decimal":0.00001}'
$ echo "$JSON" | jq .
{
  "decimal": 1e-05
}

我的目标是用这条线验证小数...

if [[ "$TMP_DECIMAL" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then

任何提示/建议?

您无法更改 jq 的行为 - 目前,相关功能请求仍处于打开状态 - 但您可以在检索数字后重新格式化数字。例如:

json='{"decimal":0.00001}'
decimal=$(jq '.decimal' <<<"$json")
decimal_f=$(awk -v decimal="$decimal" 'BEGIN { printf("%fn", decimal) }' </dev/null)
echo "JQ emitted $decimal; reformatted as $decimal_f"

此外,您可以使用perl模块JSON::P P重新格式化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
}

附言:...而且,可以使用Perl验证整个json... :)

2019 年 10 月 21 日进行的提交可确保 jq 通常保留数字的"外部"格式。有一些例外,例如多余的前导 0。

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

最新更新