问题描述
<div class="user-values"> <!-- for user's monthly gross pay -->
<label for="grosspay">Monthly gross pay: </label>
$<input id="grosspay" type="number" name="grosspay"
placeholder="0.0 or greater" step="0.01" value="${grosspay}">
<span class="req">*</span>
</div>
<div class="user-values"> <!-- for error message -->
<p class="msg">${message2}</p>
</div>
<div class="user-values"> <!-- for user's dependents -->
<label for="noOfDependents">Number of dependents: </label>
<input id="noOfDependents" type="number" name="dependents"
placeholder="0 or greater" step="1" value="${dependents}">
<span class="req">*</span>
</div>
<div class="user-values"> <!-- for error message -->
<p class="msg">${message3}</p>
</div>
“每月总薪水”接受双值。 “受抚养人数目”应仅接受整数。
运行此代码时:如果我为“从属人数”填入数字2或2,然后单击“计算”,则计算将由我的servlet成功处理。
但是,如果我填写双精度值2.1或2.2或3.1的数字,依此类推,则在表单中出现以下错误:
我的第一个问题: 输入双精度值2.0或3.0或4.0等的数字时,出现NumberFormatException
Type: class java.lang.NumberFormatException
Message: For input string: "2.0"
为什么我没有收到与上图类似的错误?或者,为什么我的处理在2.0中不成功?请提出一个解决方案,以便我可以避免1.0或2.0或3.0等值的异常?
我的第二个问题: 我的fill.jsp文件中两种输入类型的值部分在NetBeans IDE中向我发出以下警告:
"Bad value " " for attribute "value" on element "input": Expected a minus sign or a digit but saw " " instead."
如何避免这种警告?
请注意:即使出现警告,我的程序也可以正常运行。
解决方法
我想出了答案:
在我的servlet中,我有一部分代码:客户端的“ depends”输入框的值为2.0,在服务器端以String的形式接收。
String dependentNum = request.getParameter("dependents");
user.setDependents(Integer.parseInt(dependentNum));
由于某种原因,第二行代码为我抛出了NumberFormatException。因此,我将Servlet代码中的第二行更改为:
user.setDependents((int) Double.parseDouble(dependentNum));
我不知道为什么整数对象在接受字符串值2.0并将其转换为2时遇到问题。解决方法是将字符串值2.0转换为双精度并将其转换为整数,然后我避免完全获取NumberFormatException。
但是,我仍然无法理解,为什么在显示2.0、3.0等双精度值时,为什么无法显示与图像中相同的验证错误消息,如下:
,输入类型号允许使用2.0,因为从理论上讲它是整数,而2.1是双精度数。
2.0 -> 2
但是,在服务器端,它确实会引发错误,因为整数不能带有零尾或句点。
在这种情况下,您可能应该去除尾随零。
您可以使用子字符串将其剪切,然后将其转换回Integer。
例如:
double number = 2.0;
int newnumber = Integer.parseInt(String.valueOf(number).substring(0,1));
所以servlet应该看起来像这样:
String dependents = req.getParameter("dependents");
double dependentsd = Double.parseDouble(dependents);
int numofDependents = Integer.parseInt(String.valueOf(number).substring(0,1));
您可以通过以下测试案例进行验证:
String dependents = "2.0";
double dependentsd = Double.parseDouble(dependents);
int numofDependents = Integer.parseInt(String.valueOf(dependentsd).substring(0,1));
System.out.println(numofDependents);
或者您也可以将double转换为int,如下所示:
(int) Double.parseDouble(dependentNum)