FreeMarker 将带逗号的字符串转换为数字

Posted

技术标签:

【中文标题】FreeMarker 将带逗号的字符串转换为数字【英文标题】:FreeMarker convert string with commas to number 【发布时间】:2017-11-07 08:03:36 【问题描述】:

我需要在 FreeMarker 中通过删除小数位将具有逗号或点以指示千位分隔符的特定于区域设置的字符串值转换为数字。例如:13,456.7913,45623.675,9823.675

使用?number 会抛出异常,说明此字符串无法转换为数字。我在这里看到一个类似的问题: Convert string with commas into integer in Freemarker 但不存在解决方案。有办法吗?

【问题讨论】:

从根本上来说似乎是错误的设计决策。使用正确的模型。模板不应该纠正数据中的问题(在这种情况下:数字应该是真正的数字类型) @Jacek Cz 我完全同意。设计更正是我的实施列表中的下一个,因为目前在更多情况下存在类似问题。 【参考方案1】:

考虑到特定于语言环境的数字的限制,其中十进制和​​千位分隔符可以是点或逗号,并且由于我只需要显示值而不需要根据数值进行任何数值计算,因此我通过以下方式解决了这个问题只需使用 substring 忽略字符串的最后 3 个字符。这将删除小数分隔符和 2 个小数位(假设总是有 2 个小数位)。

【讨论】:

【参考方案2】:

在将变量公开给模板之前(在控制器/业务层中)我会将变量解析为整数(并在格式出现问题时做出反应)。

在我看来,模板应该只处理(有效)数据的呈现。

或者...

你可以尝试转换字符串...

<#function string_to_int s >
    <#local a = s?replace(",", "") >
    <#return a?keep_before_last(".") />
</#function>

$string_to_int("13,456.79")

会输出

13456

【讨论】:

同意,但我无法控制。需要 ftl 本身的解决方案。 千位分隔符的逗号应保持不变.. 还要考虑小数点是千位分隔符的语言环境,而小数部分的逗号将不起作用,例如。 12.234,90 ...有更通用的解决方案吗? 好的,这些是细节,您可以完善和改进#function以满足您的需求 请注意,由于?stuff-s 可以被链接,你不需要local;你可以写&lt;#return s?replace(",", "")?keep_before_last(".")&gt; @shweta:如果您甚至不知道语言环境,那么这本来就是一项不可能完成的任务。因为,1,005 是什么意思?根据区域设置,它可以是千分之一,也可以是千分之一和五分之一。

以上是关于FreeMarker 将带逗号的字符串转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

键盘输入一个字符,要求判断是不是为数字字符

SwiftUI中如何将带逗号的十进制数转换为小数(Point)?

如何使用 freemarker 将字符串转换为数字?

js 科学计数法

实验 9 根据材料编程

c语言中假设一个数组中已经存放若干个数字字符,编写程序,将每个数字字符转换成对应的数字后存放在另一个