在json数据中,如何使用jq将整数转换为美元金额?

ale*_*lec 4 json jq

我有这样的数据

{
  "dateCreated": "2020-06-12",
  "status": "pending",
  "depositDate": "2020-06-15",
  "amount": 41237
}
{
  "dateCreated": "2020-06-05",
  "status": "paid",
  "depositDate": "2020-06-08",
  "amount": 37839
}
{
  "dateCreated": "2020-04-02",
  "status": "paid",
  "depositDate": "2020-04-03",
  "amount": 67
}
Run Code Online (Sandbox Code Playgroud)

格式jq如下:

 request-some-api | jq '.data[] | {dateCreated: .created | strftime("%Y-%m-%d"), status: .status, depositDate: .arrival_date | strftime("%Y-%m-%d"), amount: .amount,}'
Run Code Online (Sandbox Code Playgroud)

我想修改.amount它,以便它显示值而不是美分数作为带有小数位的美元金额......

{
  "dateCreated": "2020-06-12",
  "status": "pending",
  "depositDate": "2020-06-15",
  "amount": $412.37
}
{
  "dateCreated": "2020-06-05",
  "status": "paid",
  "depositDate": "2020-06-08",
  "amount": $378.39
}
{
  "dateCreated": "2020-04-02",
  "status": "paid",
  "depositDate": "2020-04-03",
  "amount": $.67
}
Run Code Online (Sandbox Code Playgroud)

...但我还没有找到任何有关此的文档?是否jq能够做到这一点的转换?即使没有$符号,但只需添加.美元和美分之间的数字也会有所帮助。

Gil*_*not 5

像这样:

jq '.amount = "$" + (.amount/100|tostring)' file.json
Run Code Online (Sandbox Code Playgroud)

输出

{
  "dateCreated": "2020-06-12",
  "status": "pending",
  "depositDate": "2020-06-15",
  "amount": "$412.37"
}
{
  "dateCreated": "2020-06-05",
  "status": "paid",
  "depositDate": "2020-06-08",
  "amount": "$378.39"
}
{
  "dateCreated": "2020-04-02",
  "status": "paid",
  "depositDate": "2020-04-03",
  "amount": "$0.67"
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用字符串插值来避免显式调用`tostring`,并使用`|=`:`'.amount |= "$\(./100)"'` (2认同)

Ste*_*ris 5

您所需的输出看起来格式不正确;我希望“金额”成为一个字符串值。

您可以通过在开头添加 $,然后将金额除以 100 并转换为字符串来执行此操作

例如

jq '.amount = "$" + (.amount/100|tostring)'
Run Code Online (Sandbox Code Playgroud)

在您的测试文件上执行此操作,我们可以看到 3amount行被转换为:

"amount": "$412.37"
"amount": "$378.39"
"amount": "$0.67"
Run Code Online (Sandbox Code Playgroud)

然而,这有几个奇怪的情况,这可能(也可能不重要)很重要。如果金额以零结尾(例如 41230),那么它将显示为“$412.3”。同样,如果它是整美元 (41200),那么它将显示为“$412”。

我不确定jq有一个简单的方法来处理这些,所以我添加了几个测试:

jq '.amount = "$" + (.amount/100|tostring) + (if .amount%100 == 0 then ".0" else "" end ) + (if .amount%10 ==0 then "0" else "" end)'
Run Code Online (Sandbox Code Playgroud)

可能有更有效的方法。