3

レポートジェネレータの一種であるJSF1.2ビューがあります。ユーザーはクエリを選択し、いくつかの値を構成すると、データベースが要求され、データが収集されます。その後、データはdataTableで表示でき、最終的にExcelにエクスポートされます。これまでのところ正常に動作します。

クエリに応じて、列にはさまざまなタイプがあり、そのうちの1つはDoubleです。Doubleの値は今すぐ丸められるはずです...

多くの行(数万または数十万)があるため、時間のかかる型変換を避けるために、すべてのデータを文字列として収集します。Excelにエクスポートするには、文字列も必要なので(Office XMLに書き込まれる)、これはかなり問題ありません。

しかし、ここで丸めが行われます。dataTableでは、doubleは丸められます。Doubleがあれば、f:convertNumberを簡単に使用できますが、持っていません。

私のアイデアは、それが数値であるかどうかを分析し、文字列をフォーマットする文字列コンバーターです。(ページングされたdataTableには30程度のレコードしかないため、パフォーマンスはそれほど重要ではありません)。どうすればこれを達成できますか?

(他の)提案はありますか?ありがとう!
マーク

編集:
今のところ解決

  public class ReportStringConverter implements Converter {

  DecimalFormat f = new DecimalFormat("#0.00");  

  public Object getAsObject(FacesContext context, UIComponent component, String value)        {
    return value;
  }

  public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (isNumeric(value.toString())) {
      return f.format(Double.parseDouble(value.toString()));
    } else {
      return value.toString();
    }
  }

  private boolean isNumeric(String s) {
    try {
      double d = Double.parseDouble(s);
    } catch (NumberFormatException e) {
      return false;
    }
    return true;
  }

}
4

1 に答える 1

2

式言語を使用して、文字列に追加0することで文字列を数値に変換できます (例: #{'35.75' + 0})。これにより、簡単に使用できますf:convertNumber

<h:outputText value="#{'35.75' + 0}">
  <f:convertNumber pattern="0"/>
</h:outputText>
于 2012-09-11T08:58:20.450 に答える