2009-09-18 53 views

回答

54

作为替代方案:

<fmt:formatNumber var="expiry" 
    value="${(expire.time - now.time)/(60 * 1000)}" 
    maxFractionDigits="0" /> 

这样你就不会失去本地化(逗号和点)。

+2

我同意这个答案。 JSTL不应该关心“恰当地”执行任何逻辑如舍入。这是一个中间层次的决定。 JSP和JSTL只能用于显示。格式标记是正确的事情。 – duffymo 2009-09-18 09:59:43

+0

小心它取决于当前的区域设置https://stackoverflow.com/a/16899830/1606662 – Chintsu 2017-12-15 13:09:49

1

那这肮脏的黑客:

<c:set 
    var="expiry" 
    value="${(((expire.time - now.time)/(60 * 1000) * 100) - 0.5)/100.0}"/> 

但我会做到这一点的豆,只是显示结果在这里。除此之外,您可以define functions in your tld或者,如果您的环境中不支持该功能,则通过实现Map和(ab)使用它来获取表达式语言中的函数。您可以实现的get(Object)方法做你想要什么,这样称呼它:

<c:set 
    var="expiry" 
    value="${Helpers.round[(expire.time - now.time)/(60 * 1000)]"/> 

注意,助手提供了一个“getRound()”方法,它返回的Map实现。

2

它可能看起来像:

<c:set var="expire" value="100"/> 
<c:set var="now" value="3"/> 

<c:choose> 
<c:when test="${(expire mod now)!=0}"> 
    <c:set var="res" value="${(expire - (expire mod now))/now}"/> 
    ${res} 
</c:when> 
<c:otherwise> 
    <c:set var="res" value="${expire/now}"/> 
    ${res} 
</c:otherwise> 
</c:choose> 

注:我认为你应该使用MOD反正或者JSTL的功能,我例如使用MOD。 测试,请用不同的值“过期”和“现在”变量,应该工作正常。

8

我用:

${fn:substringBefore(expiry, '.')} 

其截断,而不是四舍五入,但可能是不够好。

+0

正是我所需要的,截断。谢谢! – Jan 2012-06-15 09:53:23

+2

请注意,在某些语言中,小数点分隔符是逗号(例如西班牙语) – 2014-07-15 16:39:43