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