Сообщение Re: Библиотека форматирования marty::format от 27.04.2025 0:03
Изменено 27.04.2025 0:04 Marty
Re: Библиотека форматирования marty::format
Прикинул, что мне нужно для реализации язычка для рисования.
Вот у меня графический компонет, shape кастомный, порт Ethernet, например.
Вот я хочу в этом шейпе сделать там метку "Eth N", где N — передаётся в шейп параметром.
Можно сделать что-то простое, но лучше сделать сразу универсальное.
Решил сделать форматирование по типу std::format.
Разбор форматной сроки сделал.
Сначала запилил по привычке на автомате, два дня мучался, хуевато вышло и не заработало нормально.
Потом подумал — нахер асинхронщину, за день сделал последовательный разбор.
Заработало почти сразу, по мелочам слегка подправил только.
Тупая работа селана, думаю, что и как делать дальше.
Тут уже надо накидать какой-то план.
Здравствуйте, Marty, Вы писали:
Оффтоп. Тут попробовал std::format, чтобы понять, по каким правилам он форматирует, и, внезапно оказалось, что он принимает только константы времени компиляции в качестве форматной строки. У меня для локализации был один колхоз, в строках можно было указывать именованные параметры, как макросы вида "$(SomeMacro)", но там все параметры отображения (для чисел, строк и прочего) зашивались в код при сборке, и я хотел от этого отойти, чтобы параметры форматирования можно было в ресурсах задавать для разных языков отдельно, и думал, что можно было бы использовать для такого std::format хотя бы с его только позиционными параметрами, а оказывается — фигушки.
В прошлый раз, когда я писал, был только накидан разбор форматной строки, и сделано форматирование всего-всего через тупой std::to_string.
Были примеры кода, но не было вывода этих примеров.
Я докинул ещё форматных фич:
И реализовал форматирование строк, булевых значений, целых значений и указателей в соответствии со спецификаторами формата. В принципе, уже вполне можно пользоваться
Краткое самари:
Напоминаю про возможность использовать именованные аргументы, а не только позиционные.
Фильтры и пайпы фильтров
Также имеется возможность использовать фильтры (пайпы фильтров) для отформатированных значений. Фильтры могут быть как встроенными, так и передаваться, как функтор, в качестве аргумента.
Встроенные фильтры: xml, xml-attr, xml-text, html, html-attr, html-text — это алиасы к одному и тому же фильтру. Фильтр sql — дублирует apos'ы
Можно иметь до четырёх фильтров в пайпе.
Да, ещё хотели калькулятор длины строки кастомный — сделал параметром шаблона.
Что ещё требуется доделать
В целом, осталось реализовать только форматирование плавучки.
Доп фичи — как тут пожелали — пользовательский литерал для строк форматирования, с обвязкой, чтобы меньше писать. Но это не особо обещаю, мне пока не пригорает.
Хочу запилить форматирование пользовательских типов. У меня есть генератор enum'ов, он умеет генерить (де)сериализацию, и энами и флаги, и генерит функции enum_serialize/enum_serialize_flags. Перво-наперво буду пилить это.
Потом буду думать (но возможно, и в процессе реализации предыдущего пункта, ибо он — частный случай), как форматировать произвольные пользовательские типы.
В любом случае, механизм будет простой — для пользовательского типа вызывается метод преобразования в строку, а затем эта строка форматируется по правилам для строк — ширина поля, выравнивание, обрезка.
Использование системной локали
Потом, наверное, допилю, чтобы был ещё один шаблонный параметр — SystemLocaleInfo, который бы умел возвращать данные из системы — разделители разрядов, десятичный разделитель...
Примеры использования
Все примеры использования
Фильтры
Форматирование строк
Форматирование булевых значений
Форматирование указателей
Форматирование целых чисел
Вот у меня графический компонет, shape кастомный, порт Ethernet, например.
Вот я хочу в этом шейпе сделать там метку "Eth N", где N — передаётся в шейп параметром.
Можно сделать что-то простое, но лучше сделать сразу универсальное.
Решил сделать форматирование по типу std::format.
Разбор форматной сроки сделал.
Сначала запилил по привычке на автомате, два дня мучался, хуевато вышло и не заработало нормально.
Потом подумал — нахер асинхронщину, за день сделал последовательный разбор.
Заработало почти сразу, по мелочам слегка подправил только.
Тупая работа селана, думаю, что и как делать дальше.
Тут уже надо накидать какой-то план.
Здравствуйте, Marty, Вы писали:
Оффтоп. Тут попробовал std::format, чтобы понять, по каким правилам он форматирует, и, внезапно оказалось, что он принимает только константы времени компиляции в качестве форматной строки. У меня для локализации был один колхоз, в строках можно было указывать именованные параметры, как макросы вида "$(SomeMacro)", но там все параметры отображения (для чисел, строк и прочего) зашивались в код при сборке, и я хотел от этого отойти, чтобы параметры форматирования можно было в ресурсах задавать для разных языков отдельно, и думал, что можно было бы использовать для такого std::format хотя бы с его только позиционными параметрами, а оказывается — фигушки.
В прошлый раз, когда я писал, был только накидан разбор форматной строки, и сделано форматирование всего-всего через тупой std::to_string.
Были примеры кода, но не было вывода этих примеров.
Я докинул ещё форматных фич:
Скрытый текст | |
![]() ![]() ![]() | |
И реализовал форматирование строк, булевых значений, целых значений и указателей в соответствии со спецификаторами формата. В принципе, уже вполне можно пользоваться
Краткое самари:
- '%' — форматный символ, вывод процентов, плавучку умножает на 100, целые — не трогает, выводит, как 'd', затем выводит символ процента
'n' — форматный символ — вывод как 'd', но с локалью текущего пользователя. Обрабатывается в форматной строке, но локаль юзера не использует.
'=' — маркер выравнивания по ширине
'~' — маркер биткаста — знаковое целое конвертируется побитно в беззнаковое соответствующего типа — не надо ручками кастить, когда хочется хекс или бин вывести. "~X" выведет "FFFFFFFF" для -1 при 32х-битном целом.
'!' — маркер инверсии регистра — при выводе хексов позволяет делать префикс в другом регистре — "!#X" выведет "0xDEADBEAF"
'h'/'H' — форматный символ для вывода хексов, без префикса, но суффиксом 'h'/'H', как в асме (если не задана опция '#' — то разницы не будет)
's'/'S' — форматный символ для типа bool — выводит bool, как строки true/false (TRUE/FALSE). Маркер инверсии регистра позволяет печатать True/False (tRUE/fALSE)
'y', 'Y' — форматный символ для типа bool и целых типов — выводит bool, как строки yes/no
't', 'T' — форматный символ для целых чисел, позволяет их выводить как bool — чтобы а) не кастить инты руками в бул, б) чтобы можно было использовать в своей скриптоте, где нет типа бул.
Для форматных символов 'y', 'Y' и 't', 'T' маркер/опция '#' (alternate form) выводит первый символ строкового представления типа bool (или целого) — 't'/'T'/'f'/'F'/'y'/'Y'/'n'/'N'.
Это равносильно, как задать точность ".1" при выводе строки.
вывод const void* как указателя — хекс, размер по ширине типа указателя на платформе, также выводит инты как указатели, но соответственно своему размеру.
'_', ',' и ''' — маркеры разделителя групп разрядов, для хекс и бин — по 4 разряда, для дек и окт — по 3. Задаются после ширины поля и после точности поля (для плавучки, если дробную часть надо разбить на разряды тоже).
Напоминаю про возможность использовать именованные аргументы, а не только позиционные.
Фильтры и пайпы фильтров
Также имеется возможность использовать фильтры (пайпы фильтров) для отформатированных значений. Фильтры могут быть как встроенными, так и передаваться, как функтор, в качестве аргумента.
Встроенные фильтры: xml, xml-attr, xml-text, html, html-attr, html-text — это алиасы к одному и тому же фильтру. Фильтр sql — дублирует apos'ы
Можно иметь до четырёх фильтров в пайпе.
Да, ещё хотели калькулятор длины строки кастомный — сделал параметром шаблона.
Что ещё требуется доделать
В целом, осталось реализовать только форматирование плавучки.
Доп фичи — как тут пожелали — пользовательский литерал для строк форматирования, с обвязкой, чтобы меньше писать. Но это не особо обещаю, мне пока не пригорает.
Хочу запилить форматирование пользовательских типов. У меня есть генератор enum'ов, он умеет генерить (де)сериализацию, и энами и флаги, и генерит функции enum_serialize/enum_serialize_flags. Перво-наперво буду пилить это.
Потом буду думать (но возможно, и в процессе реализации предыдущего пункта, ибо он — частный случай), как форматировать произвольные пользовательские типы.
В любом случае, механизм будет простой — для пользовательского типа вызывается метод преобразования в строку, а затем эта строка форматируется по правилам для строк — ширина поля, выравнивание, обрезка.
Использование системной локали
Потом, наверное, допилю, чтобы был ещё один шаблонный параметр — SystemLocaleInfo, который бы умел возвращать данные из системы — разделители разрядов, десятичный разделитель...
Примеры использования
Все примеры использования
Фильтры
Форматирование строк
Форматирование булевых значений
Форматирование указателей
Форматирование целых чисел
Re: Библиотека форматирования marty::format
Здравствуйте, Marty, Вы писали:
Оффтоп. Тут попробовал std::format, чтобы понять, по каким правилам он форматирует, и, внезапно оказалось, что он принимает только константы времени компиляции в качестве форматной строки. У меня для локализации был один колхоз, в строках можно было указывать именованные параметры, как макросы вида "$(SomeMacro)", но там все параметры отображения (для чисел, строк и прочего) зашивались в код при сборке, и я хотел от этого отойти, чтобы параметры форматирования можно было в ресурсах задавать для разных языков отдельно, и думал, что можно было бы использовать для такого std::format хотя бы с его только позиционными параметрами, а оказывается — фигушки.
В прошлый раз, когда я писал, был только накидан разбор форматной строки, и сделано форматирование всего-всего через тупой std::to_string.
Были примеры кода, но не было вывода этих примеров.
Я докинул ещё форматных фич:
И реализовал форматирование строк, булевых значений, целых значений и указателей в соответствии со спецификаторами формата. В принципе, уже вполне можно пользоваться
Краткое самари:
Напоминаю про возможность использовать именованные аргументы, а не только позиционные.
Фильтры и пайпы фильтров
Также имеется возможность использовать фильтры (пайпы фильтров) для отформатированных значений. Фильтры могут быть как встроенными, так и передаваться, как функтор, в качестве аргумента.
Встроенные фильтры: xml, xml-attr, xml-text, html, html-attr, html-text — это алиасы к одному и тому же фильтру. Фильтр sql — дублирует apos'ы
Можно иметь до четырёх фильтров в пайпе.
Да, ещё хотели калькулятор длины строки кастомный — сделал параметром шаблона.
Что ещё требуется доделать
В целом, осталось реализовать только форматирование плавучки.
Доп фичи — как тут пожелали — пользовательский литерал для строк форматирования, с обвязкой, чтобы меньше писать. Но это не особо обещаю, мне пока не пригорает.
Хочу запилить форматирование пользовательских типов. У меня есть генератор enum'ов, он умеет генерить (де)сериализацию, и энами и флаги, и генерит функции enum_serialize/enum_serialize_flags. Перво-наперво буду пилить это.
Потом буду думать (но возможно, и в процессе реализации предыдущего пункта, ибо он — частный случай), как форматировать произвольные пользовательские типы.
В любом случае, механизм будет простой — для пользовательского типа вызывается метод преобразования в строку, а затем эта строка форматируется по правилам для строк — ширина поля, выравнивание, обрезка.
Использование системной локали
Потом, наверное, допилю, чтобы был ещё один шаблонный параметр — SystemLocaleInfo, который бы умел возвращать данные из системы — разделители разрядов, десятичный разделитель...
Примеры использования
Все примеры использования
Фильтры
Форматирование строк
Форматирование булевых значений
Форматирование указателей
Форматирование целых чисел
Оффтоп. Тут попробовал std::format, чтобы понять, по каким правилам он форматирует, и, внезапно оказалось, что он принимает только константы времени компиляции в качестве форматной строки. У меня для локализации был один колхоз, в строках можно было указывать именованные параметры, как макросы вида "$(SomeMacro)", но там все параметры отображения (для чисел, строк и прочего) зашивались в код при сборке, и я хотел от этого отойти, чтобы параметры форматирования можно было в ресурсах задавать для разных языков отдельно, и думал, что можно было бы использовать для такого std::format хотя бы с его только позиционными параметрами, а оказывается — фигушки.
В прошлый раз, когда я писал, был только накидан разбор форматной строки, и сделано форматирование всего-всего через тупой std::to_string.
Были примеры кода, но не было вывода этих примеров.
Я докинул ещё форматных фич:
Скрытый текст | |
![]() ![]() ![]() | |
И реализовал форматирование строк, булевых значений, целых значений и указателей в соответствии со спецификаторами формата. В принципе, уже вполне можно пользоваться
Краткое самари:
- '%' — форматный символ, вывод процентов, плавучку умножает на 100, целые — не трогает, выводит, как 'd', затем выводит символ процента
'n' — форматный символ — вывод как 'd', но с локалью текущего пользователя. Обрабатывается в форматной строке, но локаль юзера не использует.
'=' — маркер выравнивания по ширине
'~' — маркер биткаста — знаковое целое конвертируется побитно в беззнаковое соответствующего типа — не надо ручками кастить, когда хочется хекс или бин вывести. "~X" выведет "FFFFFFFF" для -1 при 32х-битном целом.
'!' — маркер инверсии регистра — при выводе хексов позволяет делать префикс в другом регистре — "!#X" выведет "0xDEADBEAF"
'h'/'H' — форматный символ для вывода хексов, без префикса, но суффиксом 'h'/'H', как в асме (если не задана опция '#' — то разницы не будет)
's'/'S' — форматный символ для типа bool — выводит bool, как строки true/false (TRUE/FALSE). Маркер инверсии регистра позволяет печатать True/False (tRUE/fALSE)
'y', 'Y' — форматный символ для типа bool и целых типов — выводит bool, как строки yes/no
't', 'T' — форматный символ для целых чисел, позволяет их выводить как bool — чтобы а) не кастить инты руками в бул, б) чтобы можно было использовать в своей скриптоте, где нет типа бул.
Для форматных символов 'y', 'Y' и 't', 'T' маркер/опция '#' (alternate form) выводит первый символ строкового представления типа bool (или целого) — 't'/'T'/'f'/'F'/'y'/'Y'/'n'/'N'.
Это равносильно, как задать точность ".1" при выводе строки.
вывод const void* как указателя — хекс, размер по ширине типа указателя на платформе, также выводит инты как указатели, но соответственно своему размеру.
'_', ',' и ''' — маркеры разделителя групп разрядов, для хекс и бин — по 4 разряда, для дек и окт — по 3. Задаются после ширины поля и после точности поля (для плавучки, если дробную часть надо разбить на разряды тоже).
Напоминаю про возможность использовать именованные аргументы, а не только позиционные.
Фильтры и пайпы фильтров
Также имеется возможность использовать фильтры (пайпы фильтров) для отформатированных значений. Фильтры могут быть как встроенными, так и передаваться, как функтор, в качестве аргумента.
Встроенные фильтры: xml, xml-attr, xml-text, html, html-attr, html-text — это алиасы к одному и тому же фильтру. Фильтр sql — дублирует apos'ы
Можно иметь до четырёх фильтров в пайпе.
Да, ещё хотели калькулятор длины строки кастомный — сделал параметром шаблона.
Что ещё требуется доделать
В целом, осталось реализовать только форматирование плавучки.
Доп фичи — как тут пожелали — пользовательский литерал для строк форматирования, с обвязкой, чтобы меньше писать. Но это не особо обещаю, мне пока не пригорает.
Хочу запилить форматирование пользовательских типов. У меня есть генератор enum'ов, он умеет генерить (де)сериализацию, и энами и флаги, и генерит функции enum_serialize/enum_serialize_flags. Перво-наперво буду пилить это.
Потом буду думать (но возможно, и в процессе реализации предыдущего пункта, ибо он — частный случай), как форматировать произвольные пользовательские типы.
В любом случае, механизм будет простой — для пользовательского типа вызывается метод преобразования в строку, а затем эта строка форматируется по правилам для строк — ширина поля, выравнивание, обрезка.
Использование системной локали
Потом, наверное, допилю, чтобы был ещё один шаблонный параметр — SystemLocaleInfo, который бы умел возвращать данные из системы — разделители разрядов, десятичный разделитель...
Примеры использования
Все примеры использования
Фильтры
Форматирование строк
Форматирование булевых значений
Форматирование указателей
Форматирование целых чисел