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>  
下圖為範例的執行結果:

