【问题标题】:Freemarker: How to write a BigDecimal's value that can be used in a BigDecimal constructorFreemarker:如何编写可在 BigDecimal 构造函数中使用的 BigDecimal 值
【发布时间】:2022-07-17 07:16:32
【问题描述】:

我想使用 freemarker 生成实例化 BigDecimal 的 java 代码。

BigDecimal 的值在生成时存在。

BigDecimal API 的工作方式如下:

BigDecimal copy = new BigDecimal(original.toString());

唉,freemarker 魔法对我的 original 值使用数字转换,所以这不起作用(在 freemarkter 模板中):

BigDecimal copy = new BigDecimal("${original?c}");

数字转换(百分比、数字、计算机...)都不起作用 - 最有趣的是 c/computer,因为如果值变得太大,它会输出 0

在相当痛苦的情况下,我也许可以将 BigDecimal 包装在另一个对象中,它只给我一个 toString 而不是一个数字,所以 freemarker 可能会保持它的值不变并且我生成的 BigDecimal 是正确的,但这只是一个不得已。

也许有办法调用toString() 方法并将结果打印到目标文档中?

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    FreeMarke 默认所做的就是 Java 的 DecimalFormat 所做的(默认情况下本地化的 medium 格式,同样由 Java 平台定义)。

    ?c 使用带有固定US 语言环境的new DecimalFormat("0.################")(以及对INFNaN 的更多符号调整)。所以我不知道这是如何为0 提供一个巨大的BigDecimal 号码的。你确定吗?

    要获得所需的任何格式化逻辑,您可以注册自己的数字格式化程序,例如Configuration.setCustomNumberFormats(Map.of('toString'), new MyToStringTemplateNumberFormatFactory()),然后您可以使用${original?string.@toString}。或者更确切地说,您可以将number_format 设置为@toString,然后直接使用${original}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      相关资源
      最近更新 更多