JSTL 的格式標籤可以讓你針對數字、日期與時間,搭配地區設定或指定的格式來進行格式化,也可以進行數字、日期與時間的剖析,以日期、時間格式化為例:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<jsp:useBean id="now" class="java.util.Date"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<fmt:formatDate value="${now}"/><br>
<fmt:formatDate value="${now}" dateStyle="full"/><br>
<fmt:formatDate value="${now}"
type="time" timeStyle="full"/><br>
<fmt:formatDate value="${now}" pattern="dd.MM.yy"/><br>
<fmt:timeZone value="GMT+1:00">
<fmt:formatDate value="${now}" type="both"
dateStyle="full" timeStyle="full"/><br>
</fmt:timeZone>
</body>
</html>
<fmt:formatDate>
預設用來格式化日期,可根據不同的地區設定來呈現不同的格式,這個範例並沒有指定地區設定,所以會根據瀏覽器的 Accept-Language
標頭來決定地區。
dateStyle
屬性用來指定日期的詳細程度,可設定的值有 "default"
、"short"
、"medium"
、"long"
、"full"
,如果想顯示時間,要在 type
屬性上指定 "time"
或 "both"
,預設是 "date"
,timeStyle
屬性用來指定時間的詳細程度,可設定的值同樣有 "default"
、"short"
、"medium"
、"long"
、"full"
。
pattern
屬性可自訂格式,格式的指定方式與 java.text.SimpleDateFormat
的指定方式相同,可參考 SimpleDateFormat
的 API 文件說明。
<fmt:timeZone>
可指定時區,可使用字串或 java.util.TimeZone
物件指定,字串指定的方式,可參考 TimeZone
的 API 文件說明,如果需要全域的時區指定,可以使用 <fmt:setTimeZone>
標籤,<fmt:formateDate>
本身亦有個 timeZone
屬性可以進行時區設定,也可以透過屬性範圍或 Config
物件來設定,屬性名稱、常數名稱與會套用時區設定的標籤如下所示:
- 屬性名稱前置:
javax.servlet.jsp.jstl.fmt.timeZone
- Java常數:
Config.FMT_TIMEZONE
- 設置型態:
java.util.TimeZone
或String
- 由哪個標籤設置:
<fmt:setTimeZone>
- 被哪些標籤使用:
<fmt:formatDate>
下圖為範例的執行結果:
接著來看一些數字格式化的例子:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<jsp:useBean id="now" class="java.util.Date"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<fmt:formatNumber value="12345.678"/><br>
<fmt:formatNumber value="12345.678" type="currency"/><br>
<fmt:formatNumber value="12345.678"
type="currency" currencySymbol="新台幣"/><br>
<fmt:formatNumber value="12345.678" type="percent"/><br>
<fmt:formatNumber value="12345.678" pattern="#,#00.0#"/>
</body>
</html>
<fmt:formatNumber>
預設用來格式化數定,可根據不同的地區設定來呈現不同的格式,這個範例並沒有指定地區設定,所以會根據瀏覽器的 Accept-Language
標頭來決定地區。
type
屬性可設定的值有 "number"
(預設)、"currency"
、"percent"
,指定 "currency"
時會將數字依貨幣格式進行格式 化,currencySymbol
屬性可指定貨幣符號,type
指定為 "percent"
時,會以百分比格式進行格式化,也可以指定 pattern
屬性,指定格式的方式與 java.text.DecimalFormat
的說明相同,可參考 DecimalFormat
的 API 文件說明。
下圖為範例的執行結果:
<fmt:parseDate>
與 <fmt:parseNumber>
是用來剖析日期,可以在 value
屬性上指定要被剖析的數值,可以依指定的格式將數值剖析為原有的日期、時間或數字型態。
格式化標籤會使用 <fmt:bundle>
標籤指定的地區資訊,格式化標籤也會設法在可取得的 LocalizationContext
中尋找〈地區資訊〉(例如使用 <fmt:setLocale>
設定),如果格式化標籤無法從 LocalizationContext
取得地區資訊,則會 自行建立地區資訊,具體來說,格式化標籤尋找地區資訊的順序是:
- 使用
<fmt:bundle>
指定的地區資訊1. - 尋找
LocalizationContext
中的地區資訊,也就是屬性範圍中有無javax.servlet.jsp.jstl.fmt.localizationContext
屬性 - 使用瀏覽器
Accept-Language
標頭指定的偏好地區 - 使用後備地區資訊(參考〈地區資訊〉相關說明)
接著來看一些搭配地區設定的例子:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<jsp:useBean id="now" class="java.util.Date"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<fmt:setLocale value="zh_TW"/>
<fmt:formatDate value="${now}" type="both"/><br>
<fmt:formatNumber value="12345.678" type="currency"/><br>
<fmt:setLocale value="en_US"/>
<fmt:formatDate value="${now}" type="both"/><br>
<fmt:formatNumber value="12345.678" type="currency"/><br>
<fmt:setLocale value="ja_JP"/>
<fmt:formatDate value="${now}" type="both"/><br>
<fmt:formatNumber value="12345.678" type="currency"/><br>
</body>
</html>
下圖為範例的執行結果: