如何用Java中的StringTemplate(ST)格式化十进制数?

时间:2011-07-07 12:38:34

标签: java stringtemplate

我在Java中使用StringTemplate。

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

ST对象可以这样做吗?如何?

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

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

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

3 个答案:

答案 0 :(得分:10)

为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());

答案 1 :(得分: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);

答案 2 :(得分:0)

编辑:愚蠢的我,链接直接在我给的那个上面。使用Renderer like the example given here

如果您事先知道需要哪些精确度,您可以设置一个控制器来处理这些情况,并将它们推入视图。

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计算出精度,从而与model adaptors一起破解。