相关的FAQ:如果有和 1,000,000 或 1 000 000 而不是 1000000 类似的东西,
或者是 3.14 而不是 3,14 的东西,反之亦然,请参考
这里
和
这里
FAQ中相关内容,
也要注意上述内容中的内建函数
c
。
它根据程序语言的用法来进行格式化,
这对于 FreeMarker 的所有本地数字格式化设置来说是独立的。
它通常使用点来作为小数分隔符,而且它从来不用分组分隔符(像3,000,000),
指数形式(比如5E20),多余的在开头或结尾的0(比如03或1.0),还有+号(比如+1)。
它最多在小数点后打印16位,因此数值的绝对值小于1E-16将会显示为0。
该内建函数非常严格,因为作为默认(像
${x}
这样)
数字被本地(语言,国家)特定的数字格式转换为字符串,这是让用户来看的
(比如3000000可能会被打印为3,000,000)。当数字不对用户打印时
(比如,对于一个数据库记录ID,用作是URL的一部分,或者是HTML表单中的隐藏域,
或者打印CSS/JavaScript的数值文本),该内建函数必须被用来打印数字
(也就是使用
${x?c}
来代替
${x}
),
否则输出可能由于当前数字格式设置,本地化
(比如在一些国家中,小数点不是点,而是逗号)和数值
(像大数可能被分组分隔符"损坏")而损坏。
如果 FreeMarker 配置设置项
incompatible_imporvements
为 2.3.21 (或更高),该内建函数将会对正无穷/负无穷,IEEE非浮点数各自返回
"INF"
,
"-INF"
和
"NaN"
。这是这些特殊值的XML Schema兼容性表现。
(之前它会返回US本地化下的
java.text.DecimalFormat
,
不被任意(通用)计算机语言所理解。)
请注意,该内建函数
也对布尔值起作用
。
-1.5, 0.25, -0.25, 1.75, -1.75]>
<#list testlist as result>
${result} ?floor=${result?floor} ?ceiling=${result?ceiling} ?round=${result?round}
</#list>
0 ?floor=0 ?ceiling=0 ?round=0
1 ?floor=1 ?ceiling=1 ?round=1
-1 ?floor=-1 ?ceiling=-1 ?round=-1
0.5 ?floor=0 ?ceiling=1 ?round=1
1.5 ?floor=1 ?ceiling=2 ?round=2
-0.5 ?floor=-1 ?ceiling=0 ?round=0
-1.5 ?floor=-2 ?ceiling=-1 ?round=-1
0.25 ?floor=0 ?ceiling=1 ?round=0
-0.25 ?floor=-1 ?ceiling=0 ?round=0
1.75 ?floor=1 ?ceiling=2 ?round=2
-1.75 ?floor=-2 ?ceiling=-1 ?round=-2
这些内建函数在分页处理时也许有用。如果你仅仅想
展示
数字的舍入形式,那么应该使用
string
内建函数
或者
number_format
${1.2?string["0"]}
${1.8?string["0"]}
${1.5?string["0"]} <-- 1.5, rounded towards even neighbor
${2.5?string["0"]} <-- 2.5, rounded towards even neighbor
${12345?string["0.##E0"]}
将会输出:
1.234
1.234
001.00
012.10
123.46
2 <-- 1.5, rounded towards even neighbor
2 <-- 2.5, rounded towards even neighbor
1.23E4
请注意,在 FreeMarker 中,
foo.bar
和
foo["bar"]
是相同的,也可以将
x?string.currency
写为
x?string["currency"]
,当然实际中不这么用。
但是在上述示例中,我们不得不使用方括号语法,因为在语法上,
使用的字符(数字,点,
#
)不允许在点操作符之后。
由于历史原因,也可以编写如下代码
x?string("0.#")
,它和
x?string["0.#"]
完全相同。
在金融和统计学实践中,四舍五入都是根据所谓的一半原则,
这就意味着对最近的"邻居"进行四舍五入,除非离两个邻居距离相等,
这种情况下,它四舍五入到偶数的邻居。如果你注意看1.5和2.5的四舍五入的话,
这在上面的示例中是可以看到的,两个都被四舍五入到2,因为2是偶数,但1和3是奇数。
正如之前展示的预定义格式,数字的默认格式可以在模板中设置:
<#setting number_format="0.##">
${1.234}
将会输出:
请注意,数字格式是本地化敏感的,本地化设置在格式化中起作用:
<#setting number_format=",##0.00">
<#setting locale="en_US">
US people write: ${12345678}
<#setting locale="hu">
German people write: ${12345678}
将会输出:
US people write: 12,345,678.00
German people write: 12.345.678,00