如何在freemarker中自定义数字格式?

时间:2014-01-06 21:59:11

标签: java html freemarker number-formatting

我正在使用freemarker并尝试以这种格式显示数字:例如$3,343,434.00。使用${total?string.currency}(假设“total”是某个数字)很容易解决这个问题。

然而,当我有负数时,它会显示如下:($343.34)而不是:-$343.34。我需要负号而不是括号。有没有办法我可以自定义格式,以便它执行string.currency所做的所有操作但替换负值行为?我对freemarker相对较新,所以我们非常感谢您的详细回复!

5 个答案:

答案 0 :(得分:12)

您也可以尝试?string(",##0.00")。但是,在这种情况下,您需要明确添加$-符号将在$之后,如果是负数。

<#local total = 3343434/>
$ ${total?string(",##0.00")}  //$ 3,343,434.00

<#local total = -3343434/>
$ ${total?string(",##0.00")}  //$ -3,343,434.00

如果你想要的话可​​以替换字符串。

<#local total = -3343434/>
<#local total = "$ " + total?string(",##0.00")/>

${total?replace('$ -','- $')}   //- $3,343,434.00

答案 1 :(得分:3)

更新:从FreeMarker 2.3.24开始,您可以定义命名的自定义数字格式,它可以是数字格式模式的别名(甚至是用Java实现的格式化程序,但这种灵活性水平不是在这种情况下需要)。因此,在FreeMarker配置中添加一个名为“money”的自定义数字格式作为"¤,##0.00"的别名,然后您可以编写类似${total?string.@money}的内容。请参阅:http://freemarker.org/docs/pgui_config_custom_formats.html

目前FreeMarker只使用Java平台的格式化工具,因此它只能作为可配置的(假设您要使用?string?string.somethingPredefiendHere)。哪个并不多......但是,一般来说,Java平台提供的格式化类别无论如何都不是精细渐变,我的意思是,你没有应用程序域类别,例如产品价格,工资,股票的价格等等(这种需求在非货币数字的情况下更为频繁。)所以我认为,一般来说,你想制作一个格式化函数,你可以使用像${salary(someNumber)},{{这些函数可以在${price(someNumber)} / #included模板中实现,例如#imported或Java,使用#function代替#assign salary = 'com.example.SalarayMethod'?new() },#functioncom.example.SalarayMethod

答案 2 :(得分:1)

如何获取你的号码的mod,将其转换为所需的字符串格式,最后添加一个&#39; - &#39;前缀到最后一个字符串。您只需两步即可保留默认格式。

答案 3 :(得分:0)

Freemarker使用Java平台提供的货币格式。

它需要稍微调整NumberFormat.getCurrencyInstance()返回的DecimalFormat(这是调用.currency时调用的)。您可以看到examples of it here

然而,这表示在freemarker中创建一个可以处理特定格式的宏可能会更有效。

很抱歉没有这个宏看起来像什么的例子,但是因为你刚刚学习,所以它是freemarker中宏的良好入手。

您可以调查是否可以使用符合您需求的number formats公开配置​​提供自定义格式。

答案 4 :(得分:0)

如果您想保留默认的货币格式(如果需要使用'$'以外的语言环境),则可以这样替换括号:

${transaction.amount?string.currency?replace("(","-")?replace(")","")}

无论数字是负数还是正数,此操作都不会出错。

提示:在转换为货币格式之前,请确保该数字实际上是带有?number指令的数字