Форматируйте число в разделителях тысяч с помощью jq json cli - PullRequest
1 голос
/ 10 февраля 2020

Учитывая {"a": 1234567890}, я хочу 1,234,567,890 в результате, как это можно сделать с помощью jq

echo '{"a": 1234567890}' | jq '.a | FORMAT?'

Спасибо за ответ @ peak, решение -

echo '{"a": 1234567890}' | jq -r 'def h: [while(length>0; .[:-3]) | .[-3:]] | reverse | join(","); .a | tostring | h'
//-> 1,234,567,890

Ответы [ 3 ]

2 голосов
/ 11 февраля 2020

Вот обобщенное решение c для целых или целочисленных строк:

# "h" for "human-readable"
def h:
  def hh: .[0] as $s | .[1] as $answer
    | if ($s|length) == 0 then $answer
      else ((if $answer == "" then "" else "," end) + $answer ) as $a
      | [$s[0:-3], $s[-3:] + $a] | hh
      end;
   [ tostring, ""] | hh;

Пример

12, 123, 1234, 12345678 | h

Результат (с использованием опции -r):

12
123
1,234
12,345,678
2 голосов
/ 12 февраля 2020

Вот идиоматическое c однострочное определение:

def h: tostring | [while(length>0; .[:-3]) | .[-3:]] | reverse | join(",");

Пример

12, 123, 1234, 12345678 | h

Вывод (с использованием опции -r):

12
123
1,234
12,345,678
1 голос
/ 10 февраля 2020

jq не имеет (пока) функции printf для форматирования в соответствии с настройками локали. Если это вариант, вы можете передать число в оболочку, используя printf:

echo '{"a": 12345}' | jq '.a' | xargs printf "%'.f\n"
12,345

Обратите внимание, что преобразование printf использует формат %'.f, который объясняется в man 3 printf

...