Freemarker: сохраняйте конечные нули в BigDecimal

#java #freemarker

#java #freemarker

Вопрос:

Я хотел бы скопировать BigDecimal значение с произвольным количеством тралирующих нулей в шаблон Freemarker как есть (например, если вызов value.toString() в Java приводит к 123.0000 , я хочу видеть точно 123.0000 вставленное в шаблон).

Однако использование встроенных модулей (например, ?string ) или просто ${valueWithZeroes} всегда приводит к удалению конечных нулей. Об использовании ?string[...] не может быть и речи, поскольку точное количество конечных нулей неизвестно. AFAIK, есть способ вызвать BigDecimal собственный toString метод из шаблона Freemarker с использованием ?api — однако документы, похоже, не поощряют это делать. Итак, мне интересно, есть ли какой-либо другой способ добиться этого, используя сам Freemarker, не возвращаясь к методам Java.

Ответ №1:

Я считаю, java.text.DecimalFormat что не могу этого сделать, и, следовательно, FreeMarker не может сделать это из коробки. Но вы можете определить свои собственные CustomNumberFormatFactory и делать все, что возможно в Java. Смотрите пример для этого здесь: https://freemarker.apache.org/docs/pgui_config_custom_formats.html. Итак, вы делаете что-то вроде HexTemplateNumberFormatFactory этого, и вы также можете установить свой пользовательский числовой формат в качестве числового формата по умолчанию (установив number_format значение "@hex" в примере).

Обратите внимание, что если вы просто используете BigDecimal.toString как есть, форматирование не будет учитывать Locale . Таким образом, ваш десятичный разделитель будет неправильным в некоторых языках.