3

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

<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。

我用谷歌搜索并四处询问,除了通用的 Oracle 文档(http://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/fmt/tld-summary.html)之外,什么也没找到

还有其他人达到了吗?

提前致谢。

4

3 回答 3

2

我有同样的问题,但在玩了之后发现只有数字类型会被格式化。如果您先将 year 设为字符串,则它不会:

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

于 2012-10-15T12:56:25.343 回答
1

它被解释为Numberby MessageFormat,因此被格式化为千位分隔符,可以是逗号或点,具体取决于当前的语言环境。Number您可以通过添加零宽度空间来防止它被解释为 a :

<fmt:param value="${year}&#8203;"/>
于 2012-10-16T00:21:28.227 回答
0

虽然BalusC 的答案简单且表面上有效,但对我来说感觉有点不纯。首先,有一天可能会有其他人出现,想知道这个额外的角色到底是为了什么,甚至可能会删除它。

由于在底层<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.

于 2016-10-05T11:54:46.787 回答