2009-10-19 85 views
1

我正在使用struts2与Velocity 1.5和Velocity Tools 1.3。在我的模板我想去做一个循环:BigDecimal评估为Velocity中的字符串,Struts2

#set ($count = ${item.qty}) 
#foreach($i in [1..$count]) 
    ${item.price} 
    ........... 
#end 

$ {} item.qty是一个BigDecimal,但似乎它传递给速度为String可能。由于此循环不起作用。替换为$ count = 5可以正常工作,并且打印$ {item.qty}会给我一个结果5. Velocity 1.5和Tools 1.3是Struts2将支持的最高版本。想法?解决方法?谢谢

+0

是否将'qty'改为int,在bean中有效? – 2009-10-20 04:59:54

回答

0

我想你需要将它转换/整数转换为你的循环工作的整数。

#set ($count = $item.getQty().intValue()) 
+0

我没有意识到这是速度可能的。谢谢! – Fedor 2009-10-22 03:19:49

0

也许你需要实现自己的迭代器 - 它只是存储BigDecimals的列表的开始和结束,并返回当前之一。通过这种方式,你可以有一个数字无限大小的列表(我认为是你想要的,因为你正在使用BigDecimals的。否则,只使用int或长):

#set ($countIterator = ${item.qtyIterator}) 
#foreach($i in $countIterator) 
    ${i} 
    ....use $i as a string... 
#end 

public class QuantityIterator implement Iterator<BigDecimal> { 
    QuantityIterator(BigDecimal start, BigDecimal end) { this.start = start;this.end=end;} 
    //..implement the iterator methods like hasNext() etc 
    public hasNext() {return this.current.compareTo(this.end) < 0;} //current <= end 
    public BigDecimal next() { 
     if (!hasNext()) { 
     throw new NoSuchElementException(); 
     } 
     this.current = this.current.add(BigDecimal.ONE); 
     return this.current; 
    } 
    public void remove(){throw new UnsupportedException();} 
} 
+0

我不认为他真的需要一个循环,可以进行更多的迭代,而不是整数。该模板需要很长时间才能呈现并产生巨大的输出。 – Thilo 2009-10-22 03:32:36

+0

@Thilo:那是真的 - 但是,以防万一...... – Chii 2009-10-22 08:40:36