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%% и обрети покой. Всё остальное — лишние телодвижения.