Errors
Trino

Trino: How to format a number as percentage with 2 decimal places in Presto?

Ты выгрузил из джобы число — скажем, 0.019435618. Задача простая: превратить его в человекочитаемый процент вида 1.94%. Кажется, что одна строчка кода, но тригг

Ты выгрузил из джобы число — скажем, 0.019435618. Задача простая: превратить его в человекочитаемый процент вида 1.94%. Кажется, что одна строчка кода, но триггер для импотентного гнева наступает быстро.

Пробуешь классику, как в старом добром printf:

SELECT format('%s%%', 0.019435618 * 100)

И получаешь 1.9435618000%. Лишние нули на конце, точности как у советского трактора.

Ладно, округлим до двух знаков:

SELECT format('%s%%', round(0.019435618 * 100, 2))

Результат: 1.9400000000%. Опять мимо. Округление работает, но format с плейсхолдером %s превращает всё в строку и вываливает все десятичные нули, которые хранились в числе.

Корень зла в спецификаторе %s. Он для строк. А тебе нужно форматирование числа с фиксированной точкой.

В Presto/Trino функция format — это по сути обёртка вокруг Java String.format. Нужно использовать спецификатор для дробного числа: %f.

Правильный incantation выглядит так:

SELECT format('%.2f%%', 0.019435618 * 100)

Вот что здесь магического:

  • %f — говорит “здесь будет дробное число”.
  • .2 — указывает на два знака после запятой.
  • %% — экранированный знак процента на выводе.

Запускаешь — и на тебе: 1.94%. Чисто, без лишних нулей.

Если число уже является процентом (например, 18.932), множить на 100 не нужно. Следи за семантикой данных.

Важный нюанс: format возвращает строку. Дальше арифметику с этим значением не сделаешь. Это финальная стадия для отчёта или лога.

Бывает, что исходное значение — NULL. Тогда и результат будет NULL. Если нужно иное поведение, оберни в coalesce.

Итог: забудь про %s для чисел. Используй %.2f%% и обрети покой. Всё остальное — лишние телодвижения.