Формат номера на этикетке ZKOSS

61
3

есть ли способ форматировать номер в компоненте метки ZK, который выглядит как <label value="${each.value}"/>? Значения удваиваются, и я хочу разделить тысячи и т.д. Я знаю, что у doublebox, например, есть свойство format, но что, если я просто хочу отображать число в качестве метки? Спасибо за любую помощь.

спросил(а) 2021-01-19T13:51:16+03:00 2 месяца, 3 недели назад
1
Решение
75

Запрос функции

Прежде всего, я открыл запрос функции для этой системы слежения за ZK, которую вы можете найти здесь. Следуйте этому, если хотите обновления.

Способы реализации

На самом деле есть способы реализовать это в зависимости от того, какую модель и методы вы используете.

MVC & EL

Вы можете создать функцию EL, которая будет форматировать вас в вашем ZUL файле. Прежде всего создайте такой класс:

public class FormatElNumber {
public static String formatStock(double stock) {
final NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
return nf.format(stock);
}
}

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

<?xel-method prefix="c" name="formatStock" class="demo.grid.hierarchy.FormatElNumber"
signature="java.lang.String formatStock(double)"?>

Затем, когда у вас есть ярлык, вы можете сделать следующее:

<label style="color:red;" value="${c:formatStock(each.averageHigh)}" />

Более подробная информация об этой технике доступна здесь.

MVVM

MVVM на самом деле проще реализовать, например, вы создаете то, что называется конвертером (обратите внимание, что этот класс не проверен, но вы получаете идею).

public class NumberFormatConverter implements Converter {

@Override
public Object coerceToBean(Object val, Component comp, BindContext ctx) {
return null;
}

@Override
public Object coerceToUi(Object val, Component comp, BindContext ctx) {

if(!(val instanceof Integer)) {
throw new IllegalArgumentException("The argument must be a number!");
}

final Object tmp = ctx.getConverterArg("length");
int length = 0;

if(tmp instanceof Integer) {
length = (Integer)tmp;
}

final NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(length);

return nf.format(val);
}

}

Тогда все, что вы делаете в своем zul файле, это указать, что вы хотите использовать конвертер для значения, например:

<label value="@load(vm.message) @converter(vm.myConverter)"/>

Для получения дополнительной информации об этом методе вы можете обратиться сюда.

ответил(а) 2021-01-19T13:51:16+03:00 2 месяца, 3 недели назад
61

Из документов: http://books.zkoss.org/wiki/ZUML_Reference/EL_Expressions/Core_Methods/formatNumber

<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
<zk>
<label value="${c:formatNumber(2332315231, '$ ###,###,###.00')}" />
</zk>

ответил(а) 2021-01-19T13:51:16+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема