我在Java中使用StringTemplate。
我想以一定的精度呈现十进制数(例如小数点后的3位数)。
ST对象可以这样做吗?如何?
编辑: 澄清一下,这在渲染对象时尤为重要。例如。我的代码看起来像
String renderMe(String template, Collection<MyClass> items)
{
// render the items here using the template....
}
renderMe()不必了解MyClass的字段,特别是它不必知道哪些字段是浮点数。我正在寻找一种能够保持这种脱钩的解决方案。
答案 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)
如果您事先知道需要哪些精确度,您可以设置一个控制器来处理这些情况,并将它们推入视图。
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一起破解。