2009-09-18 1 views
29

Я занимаюсь подразделением в JSP, и я хотел бы округлить результат - как мне это сделать?Как объединить число в JSTL?

т.е.

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

... как я округлить результат?

Спасибо,

ответ

54

В качестве альтернативы:

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

Таким образом, вы не потеряете локализации (запятые и точки).

+2

Я согласен с этим ответом. JSTL не должен заниматься «правильной» реализацией любой логики, такой как округление. Это решение среднего уровня. JSP и JSTL должны отображаться только для отображения. Тег формата - правильная вещь. – duffymo

+0

Опасайтесь, это зависит от текущей локали https://stackoverflow.com/a/16899830/1606662 – Chintsu

1

насчет этого грязного хака:

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

Но я хотел бы сделать это в бобе и просто показать результат здесь. Кроме того, вы можете указать define functions in your tld или, если это не поддерживается в вашей среде, получите функции в языке выражений путем реализации Карты и (ab) ее использования. Вы реализуете метод Get (Object), чтобы сделать то, что вы хотите, и назвать его так:

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

Примечание, Помощники обеспечивает «getRound()» метод, который возвращает вашу реализацию карт.

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> 

примечания: я думаю, вы должны использовать моды в любом случае или % функциональности JSTL, я использую моды в примере. Испытайте, пожалуйста, переменные «expire» и «now» с разными значениями, должны работать нормально.

8

я использовал:

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

который обрезает, а не округление, но это может быть достаточно хорошим.

+0

Только то, что мне было нужно, усечь. Благодаря! – Jan

+2

Будьте осторожны, на некоторых языках десятичный разделитель представляет собой запятую (например, испанский) –