我发现格式标记库有奇怪的行为。我正在网页的页脚格式化版权信息。我正在使用以下伪代码:
<fmt:message var="copyright" key="someKey">
<fmt:param value="${year}"/>
</fmt:message>
...
<c:out value="${copyright}"/>
我只是将年份作为参数传递给资源包。如果你在传递之前输出年份值:
<c:out value="${year}"/>
<%-- renders as 2012 --%>
但是在传入参数后,年份被格式化为数字。该数字呈现为2,012。
我用Google搜索并询问周围除了通用Oracle文档(http://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/fmt/tld-summary.html)之外没有找到任何内容
还有其他人到过这个吗?
提前致谢。
答案 0 :(得分:2)
我遇到了同样的问题,但在玩完之后发现只会格式化数字类型。如果你先把年份作为一个字符串,那么它就赢了:
Calendar cal = Calendar.getInstance();
int currYear = cal.get(Calendar.YEAR);
String cYear = Integer.toString(currYear);
<fmt:message key="msg.parameterized"><fmt:param value="<%=currYear%>"/></fmt:message>
<fmt:message key="msg.parameterized"><fmt:param value="<%=cYear%>"/></fmt:message>
第一个将包含2,012,第二个将包含2012
答案 1 :(得分:1)
它被Number
解释为MessageFormat
因此被格式化为千位分隔符,可以是逗号或点,具体取决于当前的语言环境。您可以通过添加zero width space:
Number
<fmt:param value="${year}​"/>
答案 2 :(得分:0)
虽然BalusC's answer简单且表面上有效,但对我来说感觉有点不好。首先,其他人可能会在某一天出现,并想知道地球上有多余的角色是什么,甚至可能将其移除。
由于<fmt:message />
使用了Java的内置MessageFormat类,我们只需在ResourceBundle的消息字符串本身中插入一个格式化模式。
例如,在您的ResourceBundle中,您可以:
someKey = Copyright (c) {0,number,#} ACME Inc.
#
这里实际上可以是DecimalFormat类中记录的任何格式字符串。在这种情况下,仅#
只输出数字而无需任何其他格式。
顺便说一句,因为在这个特定实例中你想输出一年,你可以传递一个java.util.Date实例作为<fmt:param />
中的值,并在你的ResourceBundle中使用以下内容:
someKey = Copyright (c) {0,date,yyyy} ACME Inc.
在这种情况下,可以使用任何SimpleDateFormat格式字符串代替yyyy
。