LINUX.ORG.RU

Фиксированное число знаков после запятой

 ,


0

2

Проблема решена, дело было в моей невнимательности (см. ниже)

Привет, ЛОР.

Встала казалось бы, банальная задача – выводить по результатам SQL-запроса числа, где число знаков после запятой всегда фиксировано, даже если это нули.

В официальной доке SQLite написано:

The format(FORMAT,…) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library.

Но при этом в сишечке я могу написать:

    printf("%0.2f\n", 33.35);
    printf("%0.2f\n", 44.);

И первое число выведется как 33.35, а второе как 44.00. Такой результат меня устраивает, и что-то подобное я хотел получить в SQLite.

Авотфиг.

select format(magicnumber/100.00, '%0.2f') from magictable;

(где magicnumber имеет тип integer) возвращает результат с ОДНИМ нулём. Т.е. если magicnumber равен 3845, то всё в порядке, в выводе будет 38.45. А вот если он равен 4200, то вывод даст 42.0 (один нуль вместо двух).

Ради справедливости надо отметить, что эксперимент у меня не совсем чистый, я SQLite дёргаю через QtSql. Но поскольку результатом format() уже является строка, я полагаю, что на результат это влиять не должно. Совсем чистым экспериментом было бы написать тестовую программу на голом libsqlite3-dev, но боюсь, чем колхозить такой тест, я скорее плюну и сделаю форматирование не в SQL а уже на стороне плюсов, в своём наследнике QSqlQueryModel – там понятно, как это делать, и там всё работает.

Но хочется всё-таки попробовать на стороне SQL… Куда копать?

lib32-sqlite 3.47.2-1
sqlite 3.47.2-1

Обновление Спасибо, оказалось, я тупо перепутал местами аргументы функции.

★★★★★

Последнее исправление: hobbit (всего исправлений: 4)
Ответ на: комментарий от Toxo2

Упс, ай дид ит эгейн!!!

Спасибо огромное! Действительно. Помогло!

А вот почему я их перепутал — вопрос. И работало оно не совсем так, как если б я их перепутал, я видел разные формы записи этого format() (да-да, именно в интернет-примерах для SQLite).

Но это уже, конечно, из серии

ЗАПРЕЩАЮТСЯ ИССЛЕДОВАНИЯ ПРИЧИН, ПО КОТОРЫМ ПРОГРАММА РАБОТАЕТ

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 3)
19 марта 2025 г.

Беда пришла, откуда не ждали…

На манжаре всё собирается и работает. А на старенькой Федоре получаю:

no such function: format Unable to execute statement

Версия:

$ rpm -qa | grep sqlite
sqlite-libs-3.36.0-3.fc35.x86_64
sqlite-3.36.0-3.fc35.x86_64

Это действительно SQLite слишком старый? В официальной доке я не вижу упоминания, с какой версии появилась функция format.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ага!

Спасибо, подумаем, что с этим сделать. Вариант с format, наверное, лучше, если я буду делать бэк-енды с другими СУБД. Но это в сильно далёкой перспективе, для совместимости в пределах SQLite, возможно, лучше писать printf.

Подумаю.

hobbit ★★★★★
() автор топика