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

问题描述 投票:0回答:6

我正在使用 freemarker 并尝试以这种格式显示数字:例如

$3,343,434.00
。通过使用
${total?string.currency}
可以轻松解决这个问题(假设“总数”是某个数字)。

但是,当我有负数时,它会像这样显示它们:

($343.34)
而不是这样:
-$343.34
。我需要负号而不是括号。有没有一种方法可以自定义格式,以便它执行
string.currency
所做的所有操作,但替换负值行为?我对 freemarker 比较陌生,因此感谢详细的回复!

java html freemarker number-formatting
6个回答
17
投票

您也可以尝试

?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

3
投票

更新:从 FreeMarker 2.3.24 开始,您可以定义命名的自定义数字格式,它可以是数字格式模式的别名(甚至是用 Java 实现的格式化程序,但在这种情况下不需要这种程度的灵活性) 。因此,将一个名为“money”的自定义数字格式作为

"¤,##0.00"
的别名添加到 FreeMarker 配置中,然后您可以编写类似于
${total?string.@money}
的内容。请参阅:http://freemarker.org/docs/pgui_config_custom_formats.html

目前 FreeMarker 仅使用 Java 平台的格式化工具,因此它的可配置性仅限于此(假设您想使用

?string
?string.somethingPredefiendHere
)。这并不多......但是,总的来说,Java 平台提供的格式化类别无论如何都不够精细,我的意思是,您没有应用程序域类别,例如产品价格、工资、股票价格等。(尽管这种需求对于非货币数字更为常见。)所以我认为,一般来说,您想要制作一个格式化函数,您可以使用像
${salary(someNumber)}
${price(someNumber)}
,这些功能可以在常见的
#included
/
#imported
模板(如
#function
)中实现,或者在 Java 中通过使用
#assign salary = 'com.example.SalarayMethod'?new()
代替
#function
来实现,其中
com.example.SalarayMethod
TemplateMethodModelEx


1
投票

如何对您的数字取模,将其转换为所需的字符串格式,最后在最终字符串中添加“-”前缀。只需两步即可保留默认格式。


0
投票

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

它需要对 NumberFormat.getCurrencyInstance() 返回的 DecimalFormat (这是调用 .currency 时调用的)进行一些调整。您可以在此处查看示例

但是,这意味着您在 freemarker 中创建一个宏来调用来处理您的特定格式可能会更有效。

很抱歉没有该宏的示例,但它是了解 freemarker 中的宏的一个很好的入门工具,因为您刚刚学习。

您可能会调查是否可以使用公开的数字格式配置来提供自定义格式来满足您的需求。


0
投票

如果您想保持默认的货币格式(以防您需要使用“$”以外的区域设置),您可以像这样替换括号:

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

无论数字是负数还是正数,这都不会出错。

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

?number
指令的数字


0
投票
${amount?string("$,##0.00")}

结果:-$100.00 或关于标志的 $100.00 美元。

© www.soinside.com 2019 - 2024. All rights reserved.