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