2011-07-07 13 views
2

我在Java中使用StringTemplate。如何在Java中使用StringTemplate(ST)格式化十進制數字?

我想呈現一定精度的十進制數(例如小數點後的3位數)。

ST對象可以做到嗎?如何?

編輯: 澄清,這是渲染對象時尤其相關。例如。我的代碼看起來像

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

renderMe()不必知道MyClass的領域的東西,尤其是它並不需要知道哪些字段浮點。我正在尋找解決方案來維持這種解耦。

回答

10

註冊內置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()); 
+0

考慮還包括這種模板的預期呈現。 – 2012-06-16 00:02:14

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); 
+0

+1是的,它不是'StringTemplate'的責任格式化任何給定值,因爲目前已經存在的類已經做到了。 –

+0

這就是我所做的,但我希望我的StringTemplate爲此提供了一個捷徑。 – daphshez

+9

我不同意。該模型的工作是提供一個數值;視圖的工作是決定如何呈現它。小數位數是一個演示細節,不是邏輯或存儲的一部分。 – Kricket

0

編輯:愚蠢的我,鏈接是直接上面的那個我了。使用Renderer like the example given here

如果您事先知道需要哪些精度,可以設置一個Controller來處理這些情況,並將它們推入視圖。

飛濺建議一種方式,這可以完成。一個稍微更通用的方法可能是類似以下內容:

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

最後,如果你真的需要它是完全通用的,你可以砍的東西連同model adaptors通過註冊一個ModelAdaptor處理雙打(或其他),並讓它根據請求的propertyName計算出精度。

相關問題