ZKOSS标签中的数字格式

时间:2012-04-12 07:05:33

标签: zk labels

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

2 个答案:

答案 0 :(得分:2)

功能请求

首先,我在ZK的跟踪系统上打开了一个功能请求,您可以找到它here。如果您想要更新,请关注此项。

实施方式

实际上有一些方法可以实现这一点,具体取决于什么模式和&amp;你正在使用的技术。

MVC&amp; 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)}" />

有关此技术的更多信息可用here

<强> 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)"/>

有关此技术的更多信息,请参阅here

答案 1 :(得分: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>