3

我在 Java 中使用 StringTemplate。

我想以一定的精度呈现十进制数(例如小数点后3位)。

ST对象可以做到吗?如何?

编辑:澄清一下,这在渲染对象时尤其重要。例如我的代码看起来像

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

renderMe() 不需要知道 MyClass 的字段,特别是它不需要知道哪些字段是浮点数。我正在寻找一种能够保持这种解耦的解决方案。

4

3 回答 3

11

为 Number 子类注册内置 NumberRenderer,然后使用格式选项:

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

编辑:愚蠢的我,链接就在我给的那个上面。使用像这里给出的示例一样的渲染器

如果您提前知道需要哪些精度,您可以设置一个控制器来处理这些情况,并将它们推送到视图中。

splash 提出了一种可以做到这一点的方法。一种更通用的方式可能类似于以下内容:

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 来处理双精度数(或其他),并让它根据请求的 propertyName 计算出精度,从而与模型适配器一起破解一些东西。

于 2011-07-12T09:21:16.497 回答