3

フォーマットタグライブラリで奇妙な動作を見つけました。ウェブページのフッターに著作権メッセージをフォーマットしています。次の擬似コードを使用しています。

<fmt:message var="copyright" key="someKey">
    <fmt:param value="${year}"/>
</fmt:message>

...

<c:out value="${copyright}"/>

私はちょうどその年を議論としてリソースバンドルに渡しているところです。渡す前に年の値をc-outする場合:

<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

同じ問題が発生しましたが、遊んだ後、数値タイプのみがフォーマットされることがわかりました。最初に年を文字列にすると、次のようにはなりません。

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を含み、2番目はちょうど2012年を含みます

于 2012-10-15T12:56:25.343 に答える
1

Numberこれはbyとして解釈されるMessageFormatため、現在のロケールに応じて、カンマまたはドットの千の区切り記号でフォーマットされます。ゼロ幅スペースNumberを追加することで、それがとして解釈されるのを防ぐことができます。

<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クラス#で文書化されている任意のフォーマット文字列にすることができます。この場合、追加のフォーマットなしで、単独で数値を出力するだけです。#


余談ですが、この特定のインスタンスでは1年を出力するため、java.util.Dateインスタンスを値として渡し、<fmt:param />ResourceBundleで以下を使用できます。

someKey = Copyright (c) {0,date,yyyy} ACME Inc.

この場合、の代わりに任意のSimpleDateFormatフォーマット文字列を使用できますyyyy

于 2016-10-05T11:54:46.787 に答える