1、概述
JSTL格式化标签又称为I18N标签库,主要用来编写国际化的WEB应用,使用此功能可以对一个特定的语言请求做出合适的处理。
例如:中国内地用户将显示简体中文,台湾地区则显示繁体中文,使用I18N格式化标签库还可以格式化数字和日期,例如同一数字或日期,在不同国家可能有不同的格式,使用I18N格式标签库可以将数字和日期格式为当地的格式。
在JSP页面中要使用到格式化标签,需要引入下面的语句:
<%@ taglib uri="https://java.sun.com/jsp/jstl/fmt" prefix="fmt"% >2、标签概览
格式化标签:
<fmt:fromatNumber>
<fmt:formatDate>
<fmt:parseDate>
<fmt:parseNumber>
<fmt:setTimeZone>
<fmt:timeZone>国际化标签:
<fmt:setLocale>
<fmt:requestEncoding>
<fmt:bundle>
<fmt:message>
<fmt:param>
<fmt:setBundle>
3、<fmt:formatNumber>标签
此标签会根据区域定制的方式将数字格式化成数字,货币,百分比。
标签属性:
属性名 | 数据类型 | 功能描述 | 默认值 |
value | 要格式化的数字 | ||
type | 按照什么类型格式化 | number | |
pattern | 自定义格式化样式 | ||
currencyCode | 货币代码,只适用于按照货币格式化的数字(ISO-4721) | ||
currencySymbol | 货币符号,如¥,只适用于按照货币格式化的数字 | ||
groupingUsed | 是否包含分隔符 | ||
maxIntegerDigits | 整数部分最多显示多少位 | ||
mixIntegerDigits | 整数部分最少显示多少位 | ||
maxFractionDigits | 小数部分最多显示多位位 | ||
minFractionDigits | 小数部分最少显示多位位 | ||
var | 存储格式化后的结果 | ||
scope | 存储的范围 |
type属性的可选值:
名称 | 类型 | 描述 |
number | 数字 | |
currency | 货币 | |
percent | 百分比 |
实例:
a、用不同的区域格式化数字
<fmt:setLocale value="fr_fr" />
<fmt:formatNumber value="123456789.012" />
<br />
<fmt:setLocale value="zh_cn" />
<fmt:formatNumber value="123456789.012" />
<br />
<fmt:setLocale value="de_de" />
<fmt:formatNumber value="123456789.012" />结果:
123 456 789,012
123,456,789.012
123.456.789,012
注意:如果要实现国际化,那么编码格式要设置为utf-8。从程序运行效果可以看出,设定的区域不同,格式化数字的显示也会不同。
b、测试type属性的值
<fmt:setLocale value="zh_cn" />
<fmt:formatNumber value="0.3" type="number" /><br />
<fmt:formatNumber value="0.3" type="currency" /><br />
<fmt:formatNumber value="0.3" type="percent" /><br />结果:
0.3
¥0.30
30%
currencyCode为货币代码,例如美元为USD,人民币为CNY等。currencySymbol为货币符号例如,人民币为¥、美元为$。如果不指定区域,则会根据语言区域自动选择currencySymbol
c、使用货币形式对不同区域进行格式化操作
<fmt:setLocale value="zh_cn"/>
<fmt:formatNumber value="0.3" type="currency" /><br />
<fmt:setLocale value="en_Us" />
<fmt:formatNumber value="0.3" type="currency" /><br />结果:
¥0.30
$0.30
d、自定义currentcySymbol标识符
currencySymbol 属性还可以自定义要显示的头标识,但是type="currency"才会生效。例如:
<fmt:setLocale value="zh_cn"/>
<fmt:formatNumber value="0.3" type="currency" currencySymbol="#"/><br />
<fmt:setLocale value="en_Us"/>
<fmt:formatNumber value="0.3" type="currency" currencySymbol="#"/><br />结果:
#0.30
@0.30
e、自定义数字样式
<fmt:formatNumber value="12.31" pattern=".0000"/><br/>
<fmt:formatNumber value="1234" pattern="###.##E0"/>结果:
12.3100
1.234E3
4、<fmt:parseNumber>标签
此标签用来将字符串类型的数字、货币或百分比转换成数字类型,与<fmt:formatNumber>标签的作用正好相反。
标签属性:
属性名称 | 类型 | 功能描述 | 默认值 |
value | 要转换的字符串 | ||
type | 指定要转换的字符串为什么类型 | number | |
pattern | 自定义格式化样式 | ||
parseLocale | 指定区域来转换字符串 | ||
IntegerOnly | 转换后的数字是否只显示整数部分 | ||
var | 存储转换后的结果 | ||
scope | 存储的范围 |
type属性的可选值:
名称 | 类型 | 描述 |
number | String | 数字 |
currency | String | 货币 |
percent | String | 百分比 |
实例:
a、将数字字符串解析成数字
<fmt:parseNumber value="500,800,200"/>结果:
500800200
b、将百分比字符串转换成百分比
<fmt:parseNumber value="52%" type="percent" />结果:
0.52 (52%在这里是一个字符串, type指定这个字符串是什么类型的值)
c、将货币字符串转换成货币数字
<fmt:parseNumber value="¥123" type="currency" />结果:
123 (¥123在这里是一个字符串, type指定这个字符串是什么类型的值)
d、指定只显示整数部分的值
<fmt:parseNumber value="123.333" type="number" /><br/>
<fmt:parseNumber value="123.333" type="number" integerOnly="true"/><br/>结果:
123.333
123
e、指定转换的区域
<fmt:parseNumber value="¥123.333" type="currency" parseLocale="zh_CN"/><br/>
<fmt:parseNumber value="$123.333" type="currency" parseLocale="en_US"/><br/>结果:
123.333
123.333
parseLocale="en_US"主要是配合当type="currency"时用。如果要转换货币的字符串类型为value="¥123.333",不设置语言环境的话,会取当前浏览器的默认设置,否则就要加上parseLocale="zh_CN" 指定环境为中文环境。如果要转换货币的字符串类型为value="$123.333",不设置语言环境的话,会取当前浏览器的默认设置。如果默认为zh_cn的话,程序会报错的;否则就要加上parseLocale="en_US"指定环境为英文美国环境。
5、<fmt:formatDate/>标签
此标签可以将日期格式化。
标签属性:
| 属性名称 | 类型 | 功能描述 | 默认值 |
value | 用来格式化的时间或日期 | ||
type | 指定格式化的是日期还是时间或者两者都是取值范围 | date | |
pattern | 自定义格式化样式 | ||
dateStyle | 日期的格式化样式 | ||
timeStyle | 时间的格式化样式 | ||
timeZone | 指定使用的时区 | ||
var | 存储格式化后的结果 | ||
scope | 指定存储的范围 |
type可取值意义:
名称 | 类型 | 描述 |
date | String | 格式化日期 |
time | String | 格式化时间 |
both | String | 格式化日期和时间 |
dateStyle可取值意义:
名称 | 类型 | 描述 |
default | String | YYYY-MM-DD HH:MM:SS |
short | String | YY-MM-DD HH:MM:SS |
medium | String | YYYY-MM-DD HH:MM:SS |
long | String | YYYY年MM月DD日 HH:MM:SS |
full | String | YYYY年MM月DD日 星期* HH:MM:SS |
timeStyle可取值意义:
名称 | 类型 | 描述 |
default | String | YYYY-MM-DD HH:MM:SS |
short | String | YYYY-MM-DD 上午 HH:MM |
medium | String | YYYY-MM-DD HH:MM:SS |
long | String | YYYY-MM-DD 上午 HH时MM分SS秒 |
full | String | YYYY-MM-DD 上午 HH时MM分SS秒 时区 |
实例:
a、自定义格式
<fmt:setLocale value="zh_cn" />
<fmt:formatDate value="<%=new Date()%>" type="both" pattern="yyyy/MM/dd hh:mm:ss" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" pattern="yyyy-MM-dd HH:mm:ss" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" pattern="yyyy年MM月dd日 hh小时mm分钟ss秒" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" pattern="yy/MM/dd hh:mm:ss" />
<br />结果:
2014/02/08 10:19:42
2014-02-08 10:19:42
2014年02月08日 10小时19分钟42秒
14/02/08 10:19:42
注意:这里小时 hh表示12小时制, HH代表24小时制
b、格式不同区域日期
<fmt:setLocale value="zh_cn" />
<fmt:formatDate value="<%=new Date()%>" />
<br />
<fmt:setLocale value="zh_tw" />
<fmt:formatDate value="<%=new Date()%>" />大家可以看到大陆和台湾显示日期的格式是有区别的。
结果:
2009-12-7
2009/12/7
c、格式化不同区域的时间
<fmt:setLocale value="zh_cn" />
<fmt:formatDate value="<%=new Date()%>" type="time"/>
<br />
<fmt:setLocale value="zh_tw" />
<fmt:formatDate value="<%=new Date()%>" type="time"/>结果:
14:59:28
下午 02:59:28
d、设置格式化日期格式的样式
<fmt:setLocale value="zh_cn" />
<fmt:formatDate value="<%=new Date()%>" type="both" dateStyle="default" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" dateStyle="short" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" dateStyle="medium" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" dateStyle="long" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" dateStyle="full" />
<br />结果:
2009-12-7 21:30:49
09-12-7 21:30:49
2009-12-7 21:30:49
2009年12月7日 21:30:49
2009年12月7日 星期一 21:30:49
e、设置格式化时间格式样式
<fmt:setLocale value="zh_cn" />
<fmt:formatDate value="<%=new Date()%>" type="both" timeStyle="default" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" timeStyle="short" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" timeStyle="medium" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" timeStyle="long" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="both" timeStyle="full" />
<br />结果:
2009-12-7 21:35:52
2009-12-7 下午9:35
2009-12-7 21:35:52
2009-12-7 下午09时35分52秒
2009-12-7 下午09时35分52秒 CST
6、<fmt:parseDate>标签
将字符串类型的时间转换为日期类型。
标签属性:
属性名称 | 类型 | 功能描述 | 默认值 |
value | String | 用来格式化的时间或日期的字符串 | |
type | 指定格式化的是日期还是时间,或者两者都是取值范围date,time,both | ||
pattern | 自定义格式化样式 | ||
dateStyle | 日期的格式化样式(见<fmt:formatDate>) | ||
timeStyle | 时间的格式化样式(见<fmt:formatDate>) | ||
timeZone | 指定使用的时区 | ||
var | 存储格式化后的结果 | ||
scope | 指定存储的范围 |
实例:
<fmt:setLocale value="zh_cn" />
<fmt:parseDate type="date" value="2008-4-5"/>结果:
Sat Apr 05 00:00:00 CST 2008
这里已经将字符串” 2008-4-5”转换为了日期对象了。转换一定得注意,类似于2008-4-5这样的字符串,type必须为date;类似于12:34:56的字符串,type必须为time;类似于2008-4-5 12:34:56这样的字符串,type必须为both;还要注意浏览器的语言环境的设置,如果为zh_tw,那么字符串就必须得符合当地的标准;如为2009/12/7 下午 09:24:26就正确转换为日期对象,否则就会报错。
7、<fmt:setTimeZone>标签
该标签用来指定时区,影响该标签后面定义的标签,知道下一个<fmt:setTimeZone>标签。
标签属性:
属性名称 | 类型 | 功能描述 | 默认值 |
value | 设定时区 | ||
var | 存储设定的时区 | ||
scope | 存储的范围 |
value用来设定时区,可以是EST、CST、MST、PST等;如果有var属性,则将结果存储在所设定的范围之内。在属性范围内的页面都会使用该时区为默认时区。
实例:
<fmt:setLocale value="zh_cn" />
<fmt:setTimeZone value="EST" />
<fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" /><br />
<fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" /><br />
<fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" /><br />结果:
上午09时25分12秒 EST
上午09时25分12秒 EST
上午09时25分12秒 EST
此时区在该页面内都有效
8、<fmt:timeZone>标签
用来暂时设置时区。 此标签的时区只是部分,在标签开始至标签结束内有效;其它地方无效,,其它地方还是会使用默认时区。
实例:
<fmt:setLocale value="zh_cn" />
<fmt:timeZone value="EST">
<fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" />
<br />
<fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" />
<br />
</fmt:timeZone>
<fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" />结果:
下午09时52分16秒 EST
下午09时52分16秒 EST
上午10时52分16秒 CST