格式標籤


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.TimeZoneString
  • 由哪個標籤設置:<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 取得地區資訊,則會 自行建立地區資訊,具體來說,格式化標籤尋找地區資訊的順序是:

  1. 使用 <fmt:bundle> 指定的地區資訊1.
  2. 尋找 LocalizationContext 中的地區資訊,也就是屬性範圍中有無 javax.servlet.jsp.jstl.fmt.localizationContext 屬性
  3. 使用瀏覽器 Accept-Language 標頭指定的偏好地區
  4. 使用後備地區資訊(參考〈地區資訊〉相關說明)

接著來看一些搭配地區設定的例子:

<%@ 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>  

下圖為範例的執行結果:

格式標籤