如何使用< fmt:formatNumber>格式化变量? ?我正在学习JSTL并从旧的Struts标签转换。这不起作用。它无法读取距离变量!
<%double distance=geo.getDistance(geo.getLatitude(), geo.getLongitude(), lat, lng);%>
<c:set var="distanceEL" value="${distance}"/>
${distance},
<fmt:formatNumber pattern="0.0" value="${distance}"/>,
<fmt:formatNumber pattern="0.0" value="${distanceEL}"/>,
<fmt:formatNumber pattern="0.0" value="1234.567"/>,
<%= new java.text.DecimalFormat("0.0").format(distance) %>
显示为
, , , 1234.6, 19.3
我正在使用JSTL 1.2。到目前为止,我没有留下深刻印象。
答案 0 :(得分:4)
您正在将oldschool scriptlets与EL混合,并期望它们共享相同的变量范围。这不是真的。 EL(那些${}
件事件)分别在page,request,session和application范围内搜索第一个非null
属性匹配给定的名称并返回它。它不以任何方式访问 scriptlet 本地范围。
基本上,要制作
<%double distance=geo.getDistance(geo.getLatitude(), geo.getLongitude(), lat, lng);%>
以${distance}
的形式提供,您需要在任何所需的EL范围中设置它,例如请求范围
<%
double distance=geo.getDistance(geo.getLatitude(), geo.getLongitude(), lat, lng);
request.setAttribute("distance", distance);
%>
完成后,您可以使用
<fmt:formatNumber pattern="0.0" value="${distance}"/>
顺便说一句,无需按<c:set>
按摩。
注意,a说,将 scriptlets 与EL混合不是正常做法。你使用其中一个。在这种特殊情况下,该Java代码属于预处理servlet class。
另请注意,您的具体问题与JSTL没有特别关系。你刚刚指出它是一个不存在的变量。
答案 1 :(得分:1)
如果要将java变量发布到${ExpressionLanguage}
,则必须将其添加到上下文中。有应用程序,会话,请求和页面上下文。这就是我的测试页面中发生的情况。
<% ... %>
标签始终表示&#34;重量重&#34; java代码,变量在JSTL代码中不直接可见。${xx}
EL变量。<%= .. %>
嵌入式java scriptlet使用它。有时它最容易做到这一点。${EL}
- 仅变量重新引入重量级java方面,使用jsp:useBean
标记创建java变量。然后可以在<%..%>
scriptlets中看到它。${distanceEL3}
值中做了一个简单的数学表达式作为例子。tomcat/work/Catalina/localhost/mywebapp/org/apache/jsp/test_jsp.java
文件。您可以看到如何创建变量,就像手工编写的java文件一样。<强> test.jsp的强>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@
taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><%@page
contentType="text/plain; charset=UTF-8" pageEncoding="ISO-8859-1"
import="java.text.*"
%><%
double distance=1234.567;
double distance2=3456.789;
pageContext.setAttribute("distance", distance);
%>Test Results
<fmt:setLocale value="en_US" scope="page"/>
<c:set var="distanceEL" value="${distance}" />
distance=${distance}
fmt1=<fmt:formatNumber pattern="0.0" value="${distance}" />
fmt2=<fmt:formatNumber pattern="0.00" value="${distanceEL}" />
fmt3=<fmt:formatNumber pattern="0.0" value="1234.567" />
fmt4=<%= new DecimalFormat("0.0").format(distance) %>
<c:set var="distanceEL2" value="<%= distance2 %>" />
distance2=${distanceEL2}
fmt1=<fmt:formatNumber pattern="0.0" value="<%= distance2 %>" />
fmt2=<fmt:formatNumber pattern="0.00" value="${distanceEL2}" />
fmt4=<%= new DecimalFormat("0.0").format(distance2) %>
<c:set var="distanceEL3" value="${765.432-2.2}" />
<jsp:useBean id="distanceEL3" type="java.lang.Double" />
distance3=${distanceEL3}
fmt1=<fmt:formatNumber pattern="0.0" value="<%= distanceEL3 %>" />
fmt2=<fmt:formatNumber pattern="0.00" value="${distanceEL3}" />
fmt4=<%= new DecimalFormat("0.0").format(distanceEL3) %>
答案 2 :(得分:0)
我找到了!
<fmt:formatNumber pattern="0.0" value="<%=distance%>"/>
这很奇怪,因为我试过
<%= geo.getDistance(geo.getLatitude(), geo.getLongitude(), ${lat}, ${lng}) %>
爆炸了。太令人困惑了!没有在哪里解释哪个具有更高的优先级,&lt; %%&gt;或$ {}