【问题标题】:How to format Numbers in Velocity Templates?如何格式化 Velocity 模板中的数字?
【发布时间】:2012-02-07 20:47:12
【问题描述】:

我在我的速度模板中获得了一个 java 对象。该对象有一个双精度值,我想将其格式化为小数点后 2 位并将其显示在我的模板中。

我获取对象的类是这样的

Class Price
{
double value;
String currency;
}

在我的速度模板中,我得到这样的值

$price.value

但我需要在显示之前将其格式化为小数点后 2 位。

我要转换

23.59004 到 23.59

35.7 到 35.70

3.0 到 3.00

9 点到 9 点

请告诉我如何在速度模板中做到这一点?我为此搜索了很多,发现可以使用速度工具,但是没有与之相关的示例?我可以在模板中使用速度工具吗?

【问题讨论】:

    标签: java velocity


    【解决方案1】:

    Velocity 工具预计将用于 Velocity 模板;本质上它们是添加到模板中可用变量的对象,以便您可以使用$numberTool.format("#0.00", $val) 或类似的。如果没有可用的工具不能满足您的需求,只需创建一个 POJO 并将其添加到模板中。

    要使其正常工作,您还应该添加以下 maven 依赖项:

    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity-tools</artifactId>
        <version>2.0</version>
    </dependency>
    

    并编写以下代码:

    context.put("numberTool", new NumberTool());
    

    【讨论】:

    • 我无法使用 $numberTool,它只是打印 numberTool.format($val,"#0.00"),我需要包含任何内容吗?
    • 参见“org.apache.velocity.tools.generic.NumberTool”。如果您使用的是 tools.xml 配置,只需遵循 javadoc;如果没有,则创建一个新的 NumberTool 并将其添加到参数映射中。
    • 天哪,我没有检查 javadocs 并且正在拉扯我的头发:$numberTool.format($val,"#0.00")。对任何人来说,格式都是:$numberTool.format("#0.00", $val)
    • 顺便说一句,如果该工具存在于类路径中,但它没有事先放入速度上下文中,它仍然可以像这样使用:#set($numberTool=$anyPresentVar.class.forName('org.apache.velocity.tools.generic.NumberTool').newInstance())##
    • @Vazdim 如果速度得到适当保护,则不会。
    【解决方案2】:
    #set($String = "abc")
    $String.format("%.2f", $val)
    

    $val 在这种情况下必须是 Double 或 Float...

    【讨论】:

    • 确实,这个回复值得更多 +1。虽然派生自 "".someStringFunction() 成语,但它在 Velocity 中不太明显,因为不能像那样使用直接字符串。为此目的设置一个变量并不优雅,但是,再次,比那里的许多其他东西要简单得多......顺便说一句,这也适用于另一个常见但难以做的事情:转换数字类型转字符串类型,不带格式,例如$myString.format("%d", $myNumeric)
    【解决方案3】:

    格式货币($值)。这是将数字格式化为货币格式的好 Java 速度代码。

    【讨论】:

    • 这应该是答案!
    【解决方案4】:

    使用 VelocityTools 项目中的 MathTool。

    $math.roundTo(2, $val)
    

    【讨论】:

      【解决方案5】:

      仅使用 Java 格式化程序的解决方案:(无需额外的库)

      NumberFormat decimalFormat = new DecimalFormat("#.00");
      velocityContext.put("decimalFormat", decimalFormat);
      
      Int Number: $decimalFormat.format($obj.intNum)
      

      这是时间戳如何格式化为人类可读日期的方式。

      DateFormat DATETIME_FORMAT = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
      velocityContext.put("datetimeFormat", DATETIME_FORMAT);
      
      Timestamp to Date: $datetimeFormat.format($obj.timestamp)
      

      【讨论】:

      • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。
      • 完全同意你@OleV.V. - 这里的想法是提供一种从 JDK 本身获得这些格式化程序的方法,而不是拥有额外的库。人们可以使用最适合他们的任何东西。
      【解决方案6】:

      $numberTool.format("#0.00", $val)

      【讨论】:

        【解决方案7】:

        除了使用$numberTool.format 之外,更好的方法是使用基于MessageFormat 的工具类之一,它不仅仅做数字。例如,我们使用 Struts 特有的 MessageTool,但您可以使用类似 ResourceTool 的东西来代替:

        resources.properties
        some.key=The price is currently {0,number,$#.##}
        
        template.vm
        <p>
          $msg.get('some.key', 'resources', [$price])
        </p>
        

        这样,您可以在上下文中获取数字,而不仅仅是单独获取数字。在非英语语言中,数字可能更适合出现在文本的左侧、中间或其他位置。与简单地单独格式化数字相比,这为您提供了更大的灵活性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-11
          • 2010-09-25
          • 1970-01-01
          • 2012-05-17
          • 2022-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多