-
Notifications
You must be signed in to change notification settings - Fork 0
/
ref_builtins_number.html
465 lines (267 loc) · 22.9 KB
/
ref_builtins_number.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
<!doctype html>
<html lang="en" class="page-type-section">
<head prefix="og: http://ogp.me/ns#">
<meta charset="utf-8">
<title>数字内建函数 - FreeMarker 手册</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="format-detection" content="telephone=no">
<meta property="og:site_name" content="FreeMarker 手册">
<meta property="og:title" content="数字内建函数">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="http://freemarker.org/docs/ref_builtins_number.html">
<link rel="canoical" href="http://freemarker.org/docs/ref_builtins_number.html">
<link rel="icon" href="favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css">
</head>
<body itemscope itemtype="https://schema.org/Code">
<meta itemprop="url" content="http://freemarker.org/docs/">
<meta itemprop="name" content="FreeMarker 手册">
<!--[if lte IE 9]>
<div style="background-color: #C00; color: #fff; padding: 12px 24px;">Please use a modern browser to view this website.</div>
<![endif]--><div class="header-top-bg"><div class="site-width header-top"><a class="logo" href="http://freemarker.org" role="banner"> <img itemprop="image" src="logo.png" alt="FreeMarker">
</a><ul class="tabs"><li><a href="http://freemarker.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="http://freemarker.org/docs/api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="http://freemarker.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://sourceforge.net/p/freemarker/bugs/new/" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="http://freemarker.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="toc.html" class="navigation-header">Manual</a><div class="navigation-header"></div></div><div class="site-width breadcrumb-row"><ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="toc.html"><span itemprop="name">FreeMarker 手册</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="ref.html"><span itemprop="name">模板语言参考 </span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="ref_builtins.html"><span itemprop="name">内建函数参考</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="ref_builtins_number.html"><span itemprop="name">数字内建函数</span></a></li></ul><div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul class="bookmark-list"><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div> <div class="main-content site-width">
<div class="content-wrapper">
<div id="table-of-contents-wrapper" class="col-left">
<script>var breadcrumb = ["FreeMarker 手册","模板语言参考 ","内建函数参考","数字内建函数"];</script>
<script src="toc.js"></script>
<script src="docgen-resources/main.min.js"></script>
</div>
<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="ref_builtins_string.html"><span>Previous</span></a><a class="paging-arrow next" href="ref_builtins_date.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="ref_builtins_number" itemprop="headline">数字内建函数</h1>
</div></div><div class="page-menu">
<div class="page-menu-title">Page Contents</div>
<ul><li><a class="page-menu-link" href="#ref_builtin_abs" data-menu-target="ref_builtin_abs">abs</a></li><li><a class="page-menu-link" href="#ref_builtin_c" data-menu-target="ref_builtin_c">c (当被用作是数字值时)</a></li><li><a class="page-menu-link" href="#ref_builtin_is_infinite" data-menu-target="ref_builtin_is_infinite">is_infinite</a></li><li><a class="page-menu-link" href="#ref_builtin_is_nan" data-menu-target="ref_builtin_is_nan">is_nan</a></li><li><a class="page-menu-link" href="#ref_builtin_lower_abc" data-menu-target="ref_builtin_lower_abc">lower_abc</a></li><li><a class="page-menu-link" href="#ref_builtin_rounding" data-menu-target="ref_builtin_rounding">round, floor, ceiling</a></li><li><a class="page-menu-link" href="#ref_builtin_string_for_number" data-menu-target="ref_builtin_string_for_number">string (当用作是数字类型时)</a></li><li><a class="page-menu-link" href="#ref_builtin_upper_abc" data-menu-target="ref_builtin_upper_abc">upper_abc</a></li></ul> </div><p>相关的FAQ:如果有和 1,000,000 或 1 000 000 而不是 1000000 类似的东西,
或者是 3.14 而不是 3,14 的东西,反之亦然,请参考<a href="app_faq.html#faq_number_grouping">这里</a> 和 <a href="app_faq.html#faq_number_decimal_point">这里</a> FAQ中相关内容,
也要注意上述内容中的内建函数 <code class="inline-code">c</code>。</p>
<h2 class="content-header header-section2" id="ref_builtin_abs">abs</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>该内建函数从 FreeMarker 2.3.20 版本开始存在。</p>
</div>
<p>给出数字的绝对值。比如
<code class="inline-code">x?abs</code> ,如果 <code class="inline-code">x</code> 是 -5,会得到5。</p>
<h2 class="content-header header-section2" id="ref_builtin_c">c (当被用作是数字值时)</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>该内建函数从 FreeMarker 2.3.3 版本开始存在。</p>
</div>
<p>该内建函数将 "计算机语言" 的数字转换成字符串,
这都是对计算机来说的,而不是对用户。也就是说,
它根据程序语言的用法来进行格式化,
这对于 FreeMarker 的所有本地数字格式化设置来说是独立的。
它通常使用点来作为小数分隔符,而且它从来不用分组分隔符(像3,000,000),
指数形式(比如5E20),多余的在开头或结尾的0(比如03或1.0),还有+号(比如+1)。
它最多在小数点后打印16位,因此数值的绝对值小于1E-16将会显示为0。
该内建函数非常严格,因为作为默认(像 <code class="inline-code">${x}</code> 这样)
数字被本地(语言,国家)特定的数字格式转换为字符串,这是让用户来看的
(比如3000000可能会被打印为3,000,000)。当数字不对用户打印时
(比如,对于一个数据库记录ID,用作是URL的一部分,或者是HTML表单中的隐藏域,
或者打印CSS/JavaScript的数值文本),该内建函数必须被用来打印数字
(也就是使用 <code class="inline-code">${x?c}</code> 来代替 <code class="inline-code">${x}</code>),
否则输出可能由于当前数字格式设置,本地化
(比如在一些国家中,小数点不是点,而是逗号)和数值
(像大数可能被分组分隔符"损坏")而损坏。</p>
<p>如果 FreeMarker 配置设置项 <code class="inline-code">incompatible_imporvements</code>
为 2.3.21 (或更高),该内建函数将会对正无穷/负无穷,IEEE非浮点数各自返回
<code class="inline-code">"INF"</code>, <code class="inline-code">"-INF"</code> 和
<code class="inline-code">"NaN"</code>。这是这些特殊值的XML Schema兼容性表现。
(之前它会返回US本地化下的 <code class="inline-code">java.text.DecimalFormat</code>,
不被任意(通用)计算机语言所理解。)</p>
<p>请注意,该内建函数 <a href="ref_builtins_boolean.html#ref_builtin_c_boolean">也对布尔值起作用</a>。</p>
<h2 class="content-header header-section2" id="ref_builtin_is_infinite">is_infinite</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>该内建函数从 FreeMarker 2.3.20 版本开始存在。</p>
</div>
<p>辨别数字是否是无限浮点数(根据IEEE 754)。比如,
基于 <code class="inline-code">someNumber</code> 的值是否是无限,
<code class="inline-code">someNumber?is_infinite</code> 结果是
<code class="inline-code">true</code> 或 <code class="inline-code">false</code>,当然,
如果该数不是浮点类型,那么将会返回 <code class="inline-code">false</code>。</p>
<h2 class="content-header header-section2" id="ref_builtin_is_nan">is_nan</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>该内建函数从 FreeMarker 2.3.20 版本开始存在。</p>
</div>
<p>辨别数字是否是浮点数NaN(根据IEEE 754)。比如,
基于 <code class="inline-code">someNumber</code> 的值是否是 NaN,
<code class="inline-code">someNumber?is_nan</code> 结果是
<code class="inline-code">true</code> 或 <code class="inline-code">false</code>,当然,
如果该数不是浮点类型,那么将会返回 <code class="inline-code">false</code>。</p>
<h2 class="content-header header-section2" id="ref_builtin_lower_abc">lower_abc</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>该内建函数从 FreeMarker 2.3.22 版本开始存在。</p>
</div>
<p>将 <code class="inline-code">1</code>, <code class="inline-code">2</code>,
<code class="inline-code">3</code>,等...,转换为字符串 <code class="inline-code">"a"</code>,
<code class="inline-code">"b"</code>, <code class="inline-code">"c"</code>,等... 当到达
<code class="inline-code">"z"</code>时,那么会继续转换成如 <code class="inline-code">"aa"</code>,
<code class="inline-code">"ab"</code>,等... 这和电子表格应用程序(比如Excel或Calc)
的列标签有着相同的逻辑。数字的最小值是 <code class="inline-code">1</code>。
没有上限值。如果数字是 <code class="inline-code">0</code> 或更小或它不是整数,
那么模板处理将会中止并发生错误。</p>
<p>例如:</p>
<div class="code-wrapper"><pre class="code-block code-template"><#list 1..30 as n>${n?lower_abc} </#list></pre></div>
<p>输出:</p>
<div class="code-wrapper"><pre class="code-block code-output">a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad </pre></div>
<p>请参考: <a href="#ref_builtin_upper_abc"><code>upper_abc</code></a></p>
<h2 class="content-header header-section2" id="ref_builtin_rounding">round, floor, ceiling</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>内建函数 round 从 FreeMarker 2.3.13 版本开始存在。</p>
</div>
<p>使用确定的舍入法则,转换一个数字到整数:</p>
<ul>
<li>
<p><code class="inline-code">round</code>:返回最近的整数。
如果数字以.5结尾,那么它将进位(也就是向正无穷方向进位)</p>
</li>
<li>
<p><code class="inline-code">floor</code>:返回数字的舍掉小数后的整数
(也就是向负无穷舍弃)</p>
</li>
<li>
<p><code class="inline-code">ceiling</code>:返回数字小数进位后的整数
(也就是向正无穷进位)</p>
</li>
</ul>
<p>例如:</p>
<div class="code-wrapper"><pre class="code-block code-template"><#assign testlist=[
0, 1, -1, 0.5, 1.5, -0.5,
-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></pre></div>
<p>输出:</p>
<div class="code-wrapper"><pre class="code-block code-output"> 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</pre></div>
<p>这些内建函数在分页处理时也许有用。如果你仅仅想
<em>展示</em> 数字的舍入形式,那么应该使用 <a href="#ref_builtin_string_for_number"><code>string</code>
内建函数</a> 或者 <a href="ref_directive_setting.html#ref.setting.number_format"><code>number_format</code>
设置</a>。</p>
<h2 class="content-header header-section2" id="ref_builtin_string_for_number">string (当用作是数字类型时)</h2>
<p>将一个数字转换成字符串。它使用程序员通过
<code class="inline-code">number_format</code> 和 <code class="inline-code">locale</code>
设置的默认格式。也可以明确地用这个内建函数再指定一个数字格式,
这在后面会展示。</p>
<p>有四种预定义的数字格式:<code class="inline-code">computer</code>,
<code class="inline-code">currency</code>,<code class="inline-code">number</code> 和
<code class="inline-code">percent</code>。这些格式的明确含义是本地化(国家)指定的,
受Java平台安装环境所控制,而不是FreeMarker,除了
<code class="inline-code">computer</code>,用作和 <a href="#ref_builtin_c"> <code>c</code>
内建函数</a>是相同的格式。可以这样来使用预定义的格式:</p>
<div class="code-wrapper"><pre class="code-block code-template"><#assign x=42>
${x}
${x?string} <#-- the same as ${x} -->
${x?string.number}
${x?string.currency}
${x?string.percent}
${x?string.computer}</pre></div>
<p>如果你本地是US English,将会输出:</p>
<div class="code-wrapper"><pre class="code-block code-output">42
42
42
$42.00
4,200%
42</pre></div>
<p>前三个表达式的输出是相同的,因为前两个表达式是默认格式,
这里是"数字"。可以使用一个设置来改变默认设置:</p>
<div class="code-wrapper"><pre class="code-block code-template"><#setting number_format="currency">
<#assign x=42>
${x}
${x?string} <#-- the same as ${x} -->
${x?string.number}
${x?string.currency}
${x?string.percent}</pre></div>
<p>将会输出:</p>
<div class="code-wrapper"><pre class="code-block code-output">$42.00
$42.00
42
$42.00
4,200%</pre></div>
<p>因为默认的数字格式被设置成了"货币"。</p>
<p>除了这三种预定义格式,还可以使用 <a href="http://java.sun.com/j2se/1.4/docs/api/java/text/DecimalFormat.html">Java
数字格式语法</a> 中的任意数字格式:</p>
<div class="code-wrapper"><pre class="code-block code-template"><#assign x = 1.234>
${x?string["0"]}
${x?string["0.#"]}
${x?string["0.##"]}
${x?string["0.###"]}
${x?string["0.####"]}
${1?string["000.00"]}
${12.1?string["000.00"]}
${123.456?string["000.00"]}
${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"]}</pre></div>
<p>将会输出:</p>
<div class="code-wrapper"><pre class="code-block code-output">1
1.2
1.23
1.234
1.234
001.00
012.10
123.46
1
2
2 <-- 1.5, rounded towards even neighbor
2 <-- 2.5, rounded towards even neighbor
1.23E4</pre></div>
<p>请注意,在 FreeMarker 中,<code class="inline-code">foo.bar</code> 和
<code class="inline-code">foo["bar"]</code> 是相同的,也可以将
<code class="inline-code">x?string.currency</code> 写为
<code class="inline-code">x?string["currency"]</code>,当然实际中不这么用。
但是在上述示例中,我们不得不使用方括号语法,因为在语法上,
使用的字符(数字,点,<code class="inline-code">#</code>)不允许在点操作符之后。</p>
<p>由于历史原因,也可以编写如下代码
<code class="inline-code">x?string("0.#")</code>,它和
<code class="inline-code">x?string["0.#"]</code> 完全相同。</p>
<p>在金融和统计学实践中,四舍五入都是根据所谓的一半原则,
这就意味着对最近的"邻居"进行四舍五入,除非离两个邻居距离相等,
这种情况下,它四舍五入到偶数的邻居。如果你注意看1.5和2.5的四舍五入的话,
这在上面的示例中是可以看到的,两个都被四舍五入到2,因为2是偶数,但1和3是奇数。</p>
<p>正如之前展示的预定义格式,数字的默认格式可以在模板中设置:</p>
<div class="code-wrapper"><pre class="code-block code-template"><#setting number_format="0.##">
${1.234}</pre></div>
<p>将会输出:</p>
<div class="code-wrapper"><pre class="code-block code-output">1.23</pre></div>
<p>请注意,数字格式是本地化敏感的,本地化设置在格式化中起作用:</p>
<div class="code-wrapper"><pre class="code-block code-template"><#setting number_format=",##0.00">
<#setting locale="en_US">
US people write: ${12345678}
<#setting locale="hu">
German people write: ${12345678}</pre></div>
<p>将会输出:</p>
<div class="code-wrapper"><pre class="code-block code-output">US people write: 12,345,678.00
German people write: 12.345.678,00</pre></div>
<h2 class="content-header header-section2" id="ref_builtin_upper_abc">upper_abc</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>该内建函数从 FreeMarker 2.3.22 版本开始存在。</p>
</div>
<p>和 <a href="#ref_builtin_lower_abc"><code>lower_abc</code></a> 相同,
但是它转换成大写字母,比如 <code class="inline-code">"A"</code>,
<code class="inline-code">"B"</code>, <code class="inline-code">"C"</code>,… ,
<code class="inline-code">"AA"</code>, <code class="inline-code">"AB"</code>, 等...</p>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="ref_builtins_string.html"><span>Previous</span></a><a class="paging-arrow next" href="ref_builtins_date.html"><span>Next</span></a></div></div></div></div> </div>
</div>
<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="http://freemarker.org/index.html">What is FreeMarker?</a></li><li><a href="http://freemarker.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="http://freemarker.org/history.html">About us</a></li><li><a itemprop="license" href="app_license.html">License</a></li></ul></div><div class="column"><h3 class="column-header">Handy stuff</h3><ul><li><a href="http://freemarker-online.kenshoo.com/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href="https://github.com/nanlei/freemarker/tree/manual-zh-2.3-gae/src/manual">Chinese Manual on Github</a></li><li><a href="https://github.com/freemarker/freemarker">FreeMarker on Github</a></li><li><a href="https://twitter.com/freemarker">Follow us on Twitter</a></li><li><a href="https://sourceforge.net/p/freemarker/bugs/new/">Report a bug</a></li><li><a href="http://stackoverflow.com/questions/ask?tags=freemarker">Ask a question</a></li><li><a href="http://freemarker.org/mailing-lists.html">Mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/freemarker/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="http://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"><p><span class="generated-for-product">Generated for: Freemarker 2.3.23</span><span class="last-updated"> Last generated:
<time itemprop="dateModified" datetime="2015-09-18T14:38:51Z" title="Friday, September 18, 2015 2:38:51 PM GMT">2015-09-18 14:38:51 GMT</time></span></p> <p class="copyright">
© <span itemprop="copyrightYear">1999</span>–2015
<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="http://freemarker.org">The FreeMarker Project</a>. All rights reserved. </p>
</div></div></div></body>
</html>