在 fmt:formatNumber 中获取动态模式

Get dynamic pattern in fmt:formatNumber

本文关键字:获取 动态 模式 formatNumber fmt      更新时间:2023-09-26

我有以下代码:

我想用小数的数字计算格式数字的模式。

使用 jslt 呼叫 :

<td class="TD_Suivi"><fmt:formatNumber type="number" pattern="${getNumberFormatPatern(4)}" value="${toto.montant}" /> </td>

外部JavaScript函数:

function getNumberFormatPatern(nbDecimal) {
    "##,##0.00"
    var numberFormatPattern1="##,";
    var numberFormatPattern2 ="0.";
    for (i = 0; i < nbDecimal; i++) 
    { 
        numberFormatPattern1+="#";
        numberFormatPattern2+="0";
    }
    return numberFormatPattern1+numberFormatPattern2

调用我的 JavaScript 函数:

<script language="JavaScript"
    src="<util:WebPath/>/js/commun/jsControle.js"></script>

我有以下错误:

The function getNumberFormatPatern must be used with a prefix when a default namespace is not specified

不能在表达式中调用 JavaScript 函数。在客户端开始处理页面上的 JavaScript 之前,容器将使用表达式生成内容,因此容器无法解析表达式以按原样调用函数。

您有两种选择:

  1. 将该逻辑重构到后端

例如,如果您使用的是 servlet,则需要可以访问此方法:

private String getNumberFormatPattern(int nbDecimal) {
    String numberFormatPattern1 = "##,";
    String numberFormatPattern2 = "0.";
    for (int i = 0; i < nbDecimal; i++) {
        numberFormatPattern1 += "#";
        numberFormatPattern2 += "0";
    }
    return numberFormatPattern1 + numberFormatPattern2;
}

然后,您可以通过将此值与请求相关联来使表达式可用于表达式:

request.setAttribute("numberFormatPattern", getNumberFormatPattern(4));

并在表达式中这样引用它:

<fmt:formatNumber type="number" pattern="${ numberFormatPattern }" value="${ toto.montant }" />
  1. 将该逻辑重构为自定义函数

以下是有关注册和使用自定义函数的简单指南。你只需要用你的getNumberFormatPattern()函数替换charAt函数。