1. 程式人生 > >使用freemarker中的小數點處理的一點心得!

使用freemarker中的小數點處理的一點心得!

在開發中很容易忽視一點,輸入一個值(可能是小數),輸出時如果不做處理,就很容易出現 

隱形的BUG。比如,如果從資料庫取出一個0.22的數值,一般的輸出${x?if_exists?html}, 

這時是顯示0,而不是0.22。 

應該寫成${x?if_exists?string.number} 或者 ${x?if_exists.toString()?html} 

下面就是關於數字的具體介紹: 

Built-ins for numbers 

Related FAQs: Do you have things like 1,000,000 or 1 000 000 instead of 1000000, or something like 3.14 instead of 3,14 or vice versa? See this and this FAQ entry, also note the c built-in above. 


Note 

This built-in exists since FreeMarker 2.3.3. 

This built-in converts a number to string for ``computer audience'' as opposed to human audience. That is, it formats with the rules that programming languages used to use, which is independent of all the locale and number format settings of FreeMarker. It always uses dot as decimal separator, and it never uses grouping separators (like 3,000,000), nor exponential form (like 5E20), nor superfluous leading or trailing 0-s (like 03 or 1.0), nor + sign (like +1). It will print at most 16 digits after the decimal dot, and thus numbers whose absolute value is less than 1E-16 will be shown as 0. This built-in is crucial because be default (like with ${x}) numbers are converted to strings with the locale (language, country) specific number formatting, which is for human readers (like 300000 is possibly printed as 3,000,000). When the number is printed not for human audience (e.g., for a database record ID used as the part of an URL, or as invisible field value in a HTML form, or for printing CSS/JavaScript numerical literals) this built-in must be used to print the number (i.e., use ${x?c} instead of ${x}), or else the output will be possibly broken depending on the current number formatting settings and locale (like the decimal point is not dot, but comma in many countries) and the value of the number (like big numbers are possibly ``damaged'' by grouping separators). 

string (when used with a numerical value) 

Converts a number to a string. It uses the default format that the programmer has specified. You can also specify a number format explicitly with this built-in, as it will be shown later. 

There are three predefined number formats: number, currency, and percent. The exact meaning of these is locale (nationality) specific, and is controlled by the Java platform installation, rather than by FreeMarker. You can use these predefined formats like this: 




<#assign x=42> 
${x} 
${x?string}  <#-- the same as ${x} --> 
${x?string.number} 
${x?string.currency} 
${x?string.percent}  




If your locale is US English, this will certainly produce: 



42 
42 
42 
$42.00 
4,200%  




The output of first three expressions is identical because the first two expressions use the default format, which is "number" here. You can change this default using a setting: 



<#setting number_format="currency"> 
<#assign x=42> 
${x} 
${x?string}  <#-- the same as ${x} --> 
${x?string.number} 
${x?string.currency} 
${x?string.percent}  




Will now output: 



$42.00 
$42.00 
42 
$42.00 
4,200%  




since the default number format was set to "currency". 

Beside the three predefined formats, you can use arbitrary number format patterns written in Java decimal number format syntax: 



<#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")}  




outputs this: 




1.2 
1.23 
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  




Following the financial and statistics practice, the rounding goes according the so called half-even rule, which means rounding towards the nearest ``neighbor'', unless both neighbors are equidistant, in which case, it rounds towards the even neighbor. This was visible in the above example if you look at the rounding of 1.5 and of 2.5, as both were rounded to 2, since 2 is even, but 1 and 3 are odds. 

Appart from the Java decimal syntax patterns, you can also write ${aNumber?string("currency")} and like, that will do the same as ${aNumber?string.currency} and like. 

As it was shown for the predefined formats earlier, the default formatting of the numbers can be set in the template: 



<#setting number_format="0.##"> 
${1.234}  




outputs this: 



1.23  




Note that the number formatting is locale sensitive: 



<#setting locale="en_US"> 
US people write:        ${12345678?string(",##0.00")} 
<#setting locale="hu"> 
Hungarian people write: ${12345678?string(",##0.00")}  




outputs this: 



US people write:        12,345,678.00 
Hungarian people write: 12 345 678,00  




You can find information about the formatting of dates here. 
round, floor, ceiling 
Note 

The rounding built-ins exist since FreeMarker 2.3.13. 

Converts a number to a whole number using the specified rounding rule: 

    * 

      round: Rounds to the nearest whole number. If the number ends with .5, then it rounds upwards (i.e., towards positive infinity) 
    * 

      floor: Rounds the number downwards (i.e., towards neagative infinity) 
    * 

      ceiling: Rounds the number upwards (i.e., towards positive infinity) 

Example: 



<#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> 





Prints: 



    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     

相關推薦

使用freemarker中的小數點處理一點心得

在開發中很容易忽視一點,輸入一個值(可能是小數),輸出時如果不做處理,就很容易出現 隱形的BUG。比如,如果從資料庫取出一個0.22的數值,一般的輸出${x?if_exists?html}, 這時是顯示0,而不是0.22。 應該寫成${x?if_exists?string.

記錄自己對EventLoop和性能問題處理一點心得【轉】

設計 三方 性能 行修改 rtsp 基本 自己 actor模型 ima 轉自:http://www.cnblogs.com/lanyuliuyun/p/4483384.html 1、EventLoop 這裏說的EventLoop不是指某一個具體的庫或是框架,而是指一種程

使用FreeMarker生成Word出錯的一點心得

這幾天在維護一個匯出word的一個功能,領導改了word模板,不得不重來一遍。也不過是劉歡歌中所言:“只不過是重頭再來”。廢話少說,直接進入主題。用了FreeMaker這麼多天,也總結出不少規律。Fr

關於動態代理的一點心得

ade his ref logs urn err over 關於 pre 剛學習的時候總是搞不明白動態代理中哪個是代理對象,哪個是原來的對象,最近搞明白了,特地來記錄下,很淺顯,希望能夠幫助大家 一. 先寫一個接口,就叫Function,包括睡覺和吃飯方法  pack

JAVAOO一點心得體會

狀況 內容 了解 我們 沒有 邏輯 部分 掌握 是我 JAVAOO學到現在,從基本數據類型到基本語句,再到一些語言特性,再到 IO 操作,網絡操作。 學的並不算特別好,尤其是反射那部分還有不少不懂的地方,但是卻有一種豁然開朗的感覺,因為我對基本語言學習完成之後的兩個方向軟

關於jquery全選反選 批量刪除的一點心得

批量刪除 rem cnblogs success 需要 rip 多說 reac == 廢話不多說直接上代碼: 下面是jsp頁面的html代碼: <table id="contentTable" class=""> <thead>

matlab矩陣(一)--如何控制矩陣中小數點的位數

數字 hex git png 它的 類型 整型 cal -s format:設置輸出格式對浮點性變量,缺省為format short.format並不影響matlab如何計算和存儲變量的值。對浮點型變量的計算,即單精度或雙精度,按合適的浮點精度進行,而不論變量是如何顯示的。

最近摸索arcgis的一點心得,希望對初來著有些幫助

是把 phi pan nts rest bootstra mas 圖片 creates 最近突然想寫點東西,記錄一下對軟件開發上的一些學習心得(其實一直以來都想寫點東西,慰藉自己在這些年踩過的坑留點)。 主要寫三個大方面: 1、 arcgis 記錄arcgis for

bs4爬蟲的一點心得----坑

soup eth 嘗試 BE 字符串 遇到 運行循環 section 屬性 bs4 裏提取a標簽裏的坑啊 今天遇到了一個很坑的事情 使用bs4(全稱:BeautifulSoup)提取一個網頁裏所有a標簽裏的href屬性 比較坑的地方是這個網頁裏有的a標簽裏沒有hr

淺談API測試與UI Auomation一點心得

API測試 自動化測試 background:最近兩個月被分配做UI automation,原因是換了一套平臺,需要重新部署,有些業務需求改了case都跑不過了,我的任務是debug case,把case都跑通。工具是Robot Framework。當時感覺task相對輕松,因為業務相對簡單,只是Ca

[轉]關於編寫Nios II的延時函數的一點心得

RoCE x11 小時 軟件 arc pla sys return tro 平臺 硬件:nios/f 100MHz 軟件: 內容 0 一點說明 本文僅討論所述平臺的一點心得,若其他等級的nios或優化,請自行研究。 1 usleep()有多準 參考[筆記].怎樣使用

圖解112-蛇蛋圖:哎呀,太不小心了.PHP圖片處理分析問題

span open inf 生成 req random 內容 當我 訪問 在yii2應用中,使用imagine庫生成分享圖實戰。 這個需求現在特別常見,比如生成小程序分享圖、生成朋友圈分享圖等等,一般是文字 + 二維碼 + 背景模板。今天我們使用imagine來完成這件事情

Vuex 實際使用中的一點心得 —— 一刷新就沒了

store 點心 需要 一點 con app patch 介紹 很多 問題 在開發中,有一些全局數據,比如用戶數據,系統數據等。這些數據很多組件中都會使用,我們當然可以每次使用的時候都去請求,但是出於程序員的“潔癖”、“摳”等等優點,還是希望一次請求,到處使用。 這時候很自

初學ajax的一點心得

寫下自己對ajax初學時認為是要背下來的東西 首先ajax是可以和jquer一起要用的 eg:  <script  type="text/javascript">    //ajax時間是在JS中的 $.ajax({//注意$符號

關於A*演算法的一點心得

思路來源 https://blog.csdn.net/haolexiao/article/details/70302848 https://www.cnblogs.com/yyf0309/p/8438849.html 心得 啟發式搜尋,聽上去挺高階的, 這也是我入acm界一年多沒

新公司?大客戶?繁雜業務處理別慌張

製造企業新公司成立,喜迎大把客戶訂單,各類業務處理耗時耗力,內部部署高投資、高成本,怎麼辦?雲ERP滿足迅速部署需求 “如果當初我們採用的是傳統部署 ERP,那麼除了要在硬體上投資外,還至少需要配備現在規模2~4倍的ERP團隊成員,才能滿足我們 24*7 全天候運營的支援服務要求。而現在有了 QAD 雲 E

程式設計師升職最快的原因竟然程式碼寫的最爛?網友評論:沒有一點毛病

都說程式設計師是個技術活,職位定級升職加薪全憑技術能力。但是問問行內人好像並不是這麼一回事,這麼為什麼呢?近日有網友發帖闡述:大家有沒有發現,公司裡升職升的最快的,往往是程式碼寫的最爛的那批人,你程式碼寫的好,不但升不上去,還得維護他們留下的爛程式碼。是這樣子嗎? 這話雖然說的沒水平,

關於搭建直播系統平臺的一點心得經驗和建議

選擇 關於 產品 fps 高清 而在 必須 處理 就是 如今的直播發展如此迅猛,不管是短視頻APP還是購物APP都開通了直播功能,下面根據我個人的從業經驗講一下,希望和大家一起學習和提高。就直播的整個業務邏輯來說,主要分為“采集、前處理、編碼、傳輸、解碼、渲染”這幾個環節,

python中小數點後取2位(四捨五入)以及取2位(四舍五不入)

一.小數點後取2位(四捨五入)的方法方法一:round()函式其實這個方法不推薦大家使用,查詢資料發現裡面的坑其實很多,python2和python3裡面的坑還不太一樣,在此簡單描述一下python3對應的坑的情況。 a = 1.23456b = 2.355c = 3.5d = 2.5print(round

python中小數點後取2位(四舍五入)以及取2位(四舍五不入)

net 描述 原因 imp 小數位 字符 ima 很多 位或 一.小數點後取2位(四舍五入)的方法方法一:round()函數其實這個方法不推薦大家使用,查詢資料發現裏面的坑其實很多,python2和python3裏面的坑還不太一樣,在此簡單描述一下python3對應的坑的情