项目进中,日期格式化原本这样一直好好的: fmt:formatDate pattern= "yyyy-MM-dd" value= " ${now} " / 结果突然不知道怎么着,有些页面的日期格式化无效了。很诡异,但孤有句名言,代码里百分之
项目进中,日期格式化原本这样一直好好的:
<fmt:formatDate pattern="yyyy-MM-dd" value="${now}" />
结果突然不知道怎么着,有些页面的日期格式化无效了。很诡异,但孤有句名言,代码里百分之百没有诡异的事,看上去越离奇,事实上是自己犯了越二的错。
在网上查了查看,说是时区问题,虽然不知道 怎么着好好的时区,突然就离家出走了。但是加上后确实好了。
最终知道了原因,因为前两天项目老大加了JSP静态化为HTML的功能,用于提速。由于是部分数据变化不大并且访问频繁的页面加了静态化,其它的没有加。所以才会出现,上面说的诡异情况。
<fmt:setLocale value="zh_CN"/>
又过了几天,数字格式化竟然也出翔了:
<fmt:formatNumber maxFractionDigits="2" value="${goods.shopPrice}" pattern="#.00" />
也是突如其来。不知道 怎么它就失效了,并不是fmt:formatNumber完全挂了,而只是格式化这功能不起作用。
先说解决:还是加上
<fmt:setLocale value="zh_CN"/>
这真是日了狗了,我白搞了一整天。晚上回家蹲坑才想到有可能是它作怪。茅房果然是灵感的十字路口。
再说说我一开始那坑爹的方案:
我添加了个 自定义EL函数,然后发现,加这个容易,但是要把项目中所有 fmt:formatNumber 标签都替换掉,这个工作量有点。。。呵呵。。
自定义标签配置XML
<?xml version="1.0" encoding="utf-8" ?>
<taglib xmlns="http://Java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0">
<description>A taglib to define some EL accessible functions.</description>
<tlib-version>1.0</tlib-version>
<short-name>ELFunctionTaglib</short-name>
<uri>ELFunctionTagLibrary</uri>
<function>
<name>showPrice</name>
<function-class>com.ahead.core.jsp.ELFunctions</function-class>
<function-signature>java.lang.String showPrice(java.lang.String , int)</function-signature>
</function>
</taglib>
JAVA实现代码
package com.ahead.core.jsp;
import java.math.BigDecimal;
/** * 自定义EL函数 * @author walkguitar //这是我们老大 * */
public class ELFunctions {
/** * 截断小数,保留 scale 位(不足补零),多出部分直接丢弃 * @param value 需要截断的数字 * @param maxFractionDigits 小数点后保留几位 * @return String */
public static String showPrice(String value, int maxFractionDigits){
BigDecimal decimal = new BigDecimal(value);
return decimal.setScale(maxFractionDigits, BigDecimal.ROUND_DOWN).toString();
}
public static void main(String[] args) throws Exception{
String s = "";
s = showPrice("1635135.166", 5);
System.out.println(s);
s = showPrice("-1635135.166", 5);
System.out.println(s);
s = showPrice("1635135.165", 4);
System.out.println(s);
s = showPrice("-1635135.165", 4);
System.out.println(s);
s = showPrice("1635135.164", 4);
System.out.println(s);
s = showPrice("-1635135.164", 4);
System.out.println(s);
}
}
JSP中使用
<%@ taglib prefix="ef" uri="ELFunctionTagLibrary"%>
<div>${ef:showPrice(1.23456, 2)}</div>
具体详情的说明,还是到网上去查查吧。