我正在使用 freemarker 并尝试以这种格式显示数字:例如
$3,343,434.00
。通过使用 ${total?string.currency}
可以轻松解决这个问题(假设“总数”是某个数字)。
但是,当我有负数时,它会像这样显示它们:
($343.34)
而不是这样:-$343.34
。我需要负号而不是括号。有没有一种方法可以自定义格式,以便它执行 string.currency
所做的所有操作,但替换负值行为?我对 freemarker 比较陌生,因此感谢详细的回复!
您也可以尝试
?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
更新:从 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
。
如何对您的数字取模,将其转换为所需的字符串格式,最后在最终字符串中添加“-”前缀。只需两步即可保留默认格式。
如果您想保持默认的货币格式(以防您需要使用“$”以外的区域设置),您可以像这样替换括号:
${transaction.amount?string.currency?replace("(","-")?replace(")","")}
无论数字是负数还是正数,这都不会出错。
提示:在转换为货币格式之前,请确保该数字实际上是带有
?number
指令的数字
${amount?string("$,##0.00")}
结果:-$100.00 或关于标志的 $100.00 美元。