如何在freemarker中自定义数字格式?
Posted
技术标签:
【中文标题】如何在freemarker中自定义数字格式?【英文标题】:How to customize number format in freemarker? 【发布时间】:2014-01-24 10:52:40 【问题描述】:我正在使用 freemarker 并尝试以这种格式显示数字:例如 $3,343,434.00
。这很容易通过使用$total?string.currency
来解决(假设“total”是某个数字)。
但是,当我有负数时,它会像这样显示它们:($343.34)
而不是:-$343.34
。我需要负号而不是括号。有没有办法可以自定义格式,以便它完成 string.currency
所做的所有事情,但替换负值行为?我对 freemarker 比较陌生,因此感谢您提供详细的回复!
【问题讨论】:
【参考方案1】:你也可以试试?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
【讨论】:
【参考方案2】:更新:从 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
模板中实现,如#function
或在Java 中使用#assign salary = 'com.example.SalarayMethod'?new()
代替#function
,其中com.example.SalarayMethod
是TemplateMethodModelEx
。
【讨论】:
【参考方案3】:如何获取您的号码的 mod,将其转换为所需的字符串格式,最后在最终字符串中添加一个“-”前缀。您只需两步即可保留默认格式。
【讨论】:
【参考方案4】:Freemarker 使用 Java 平台提供的货币格式。
它需要对 NumberFormat.getCurrencyInstance() 返回的 DecimalFormat 进行一些调整(调用 .currency 时会调用它)。你可以看到examples of it here。
但是,这表示您在 freemarker 中创建一个宏来调用它可能会更有效,该宏将处理您的特定格式。
很抱歉没有该宏的示例,但它是 freemarker 中宏的一个很好的入门,因为您只是在学习。
您可能会调查是否可以使用number formats 的公开配置提供自定义格式以满足您的需求。
【讨论】:
日期和数字格式最好在#function
-s 中完成,然后在#macro
-s 中完成,除非您的格式是 HTML 标记(颜色等)。【参考方案5】:
如果您想保持默认的货币格式(以防您需要使用“$”以外的语言环境),您可以像这样替换括号:
$transaction.amount?string.currency?replace("(","-")?replace(")","")
无论数字是负数还是正数,这都不会出错。
提示:在转换为货币格式之前,请确保该数字实际上是带有 ?number
指令的数字
【讨论】:
以上是关于如何在freemarker中自定义数字格式?的主要内容,如果未能解决你的问题,请参考以下文章