fmt:消息将无意的逗号添加到数字中

时间:2012-06-15 21:53:32

标签: java jsp jstl

我发现格式标记库有奇怪的行为。我正在网页的页脚格式化版权信息。我正在使用以下伪代码:

<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)之外没有找到任何内容

还有其他人到过这个吗?

提前致谢。

3 个答案:

答案 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}&#8203;"/>

答案 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