3

JavaでStringTemplateを使用しています。

10 進数を特定の精度 (たとえば、小数点以下 3 桁) でレンダリングしたいと考えています。

STオブジェクトがそれを行うことは可能ですか? そしてどうやって?

編集:明確にするために、これはオブジェクトをレンダリングするときに特に関連します。たとえば、私のコードは次のようになります

String renderMe(String template, Collection<MyClass> items)
{
  // render the items here using the template.... 
}

renderMe() は MyClass のフィールドについて何も知る必要はありません。特に、どのフィールドが浮動小数点であるかを知る必要はありません。このデカップリングを維持するソリューションを探しています。

4

3 に答える 3

11

Number サブクラスのビルトイン NumberRenderer を登録してから、format オプションを使用します。

String template =
    "foo(x,y) ::= << <x; format=\"%,d\"> <y; format=\"%,2.3f\"> >>\n";
STGroup g = new STGroupString(template);
g.registerRenderer(Number.class, new NumberRenderer());
于 2011-07-12T16:45:37.263 に答える
3

テストされていませんが、次のようなものが機能するはずです。

StringTemplate strTemp = new StringTemplate("Decimal number: $number$");
NumberFormat nf = NumberFormat.getInstance();
((DecimalFormat)nf).applyPattern("0.000");
strTemp.setAttribute("number", nf.format(123.45678));
System.out.println(strTemp);
于 2011-07-07T12:47:22.060 に答える
0

編集:愚かな私、リンクは私が与えたものの真上にありました。here の例のように Rendererを使用します。

必要な精度が事前にわかっている場合は、それらのケースを処理するようにコントローラーを設定し、それらをビューにプッシュできます。

スプラッシュは、これを行う方法を提案しました。もう少し一般的な方法は、次のようなものです。

class DoublePrecisionGetters {
  public double number;
  public NumberFormat nf = NumberFormat.getInstance();

  public DoublePrecisionGetters(double d)
  { number = d; }

  public String getTwoPlaces() {
    nf.applyPattern("0.00");
    return nf.format(number);
  }

  public String getThreePlaces() {
    nf.applyPattern("0.000");
    return nf.format(number);
  }

  // etc
}

ST を次のようにセットアップします。

ST template = new ST("two places: $number.twoPlaces$", '$');
template.setAttribute("number", new DoublePrecisionGetters(3.14159));

最後に、本当に完全にジェネリックにする必要がある場合は、ModelAdaptor を登録して double (または何でも) を処理し、要求された propertyName に基づいて精度を計算させることで、モデル アダプターと一緒に何かをハックできます。

于 2011-07-12T09:21:16.497 に答える