【问题标题】:How to customize number format in freemarker?如何在freemarker中自定义数字格式?
【发布时间】:2014-01-24 10:52:40
【问题描述】:

我正在使用 freemarker 并尝试以这种格式显示数字:例如 $3,343,434.00。这很容易通过使用${total?string.currency} 来解决(假设“total”是某个数字)。

但是,当我有负数时,它会像这样显示它们:($343.34) 而不是:-$343.34。我需要负号而不是括号。有没有办法可以自定义格式,以便它完成 string.currency 所做的所有事情,但替换负值行为?我对 freemarker 比较陌生,因此感谢您提供详细的回复!

【问题讨论】:

    标签: java html freemarker number-formatting


    【解决方案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 指令的数字

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-10-19
            • 2016-10-10
            • 2020-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-06
            相关资源
            最近更新 更多