1

有没有办法在 ZK 标签组件中格式化数字,看起来像 <label value="${each.value}" />?值是双倍的,我想分隔数千等...我知道例如 doublebox 具有格式属性,但如果我只想将数字显示为标签怎么办?谢谢你的帮助。

4

2 回答 2

2

功能要求

首先,我在 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)"/>

有关此技术的更多信息,您可以参考此处

于 2012-04-12T07:53:30.797 回答
1

来自文档: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>
于 2013-07-17T12:54:21.410 回答