如何在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.SalarayMethodTemplateMethodModelEx

【讨论】:

【参考方案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中自定义数字格式?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot整合freemarker中自定义标签获取字典表的数据

数据绑定期间如何在datagridview中自定义格式数据

FreeMarker页面静态化入门

struts2中的freemarker配置

如何使用JS在HTML中自定义字符串格式化

Freemarker数字格式化总结