我正在使用freemarker并尝试以这种格式显示数字:例如$3,343,434.00
。使用${total?string.currency}
(假设“total”是某个数字)很容易解决这个问题。
然而,当我有负数时,它会显示如下:($343.34)
而不是:-$343.34
。我需要负号而不是括号。有没有办法我可以自定义格式,以便它执行string.currency
所做的所有操作但替换负值行为?我对freemarker相对较新,所以我们非常感谢您的详细回复!
答案 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()
},#function
是com.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
指令的数字