【问题标题】:input type number restriction to an INTEGER in jspjsp中对INTEGER的输入类型数限制
【发布时间】:2021-01-03 20:12:51
【问题描述】:

我有一个fill.jsp 文件,其中有以下代码:

<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 等等,我的表单中会出现以下错误:

我的第一个问题: 当我输入double值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."

如何避免出现此警告?

请注意:即使出现警告,我的程序也能正常运行。

【问题讨论】:

  • 我想你误解了我的问题。我在问题中做了更多的澄清。
  • 新答案似乎编译得很好。
  • 我还在努力。如果它工作正常,会通知你。
  • 好的。很高兴听到。

标签: validation jsp servlets jakarta-ee numberformatexception


【解决方案1】:

我想出了答案:

在我的 servlet 中,我有一段代码:客户端的“依赖项”输入框的值为 2.0,在服务器端作为字符串接收。

String dependentNum = request.getParameter("dependents");
user.setDependents(Integer.parseInt(dependentNum));

由于某种原因,第二行代码为我抛出了 NumberFormatException。因此,我将 servlet 代码中的第二行更改为:

user.setDependents((int) Double.parseDouble(dependentNum));

我不知道为什么 Integer 对象在接受 String 值 2.0 并将其转换为 2 时遇到问题。解决方法是将 String 值 2.0 转换为 double 并将其转换为 int,然后我完全避免得到 NumberFormatException。

但是,我仍然无法理解,为什么对于像 2.0、3.0 这样的双精度值,当它可以显示像 2.1、3.2 等双精度值时,不能显示与图像中相同的验证错误消息,如下:

【讨论】:

  • 我做了一些挖掘,根据 Mozilla 开发者的网站,如果你尝试输入带小数的数字(例如“1.0”),会被认为是无效的。 (当步骤为“1”时,或当然)这使我确信这是一个错误。你可以看到更多here
【解决方案2】:

输入类型号允许 2.0,因为它理论上是一个整数,不像 2.1,它是一个双精度数。

2.0 -> 2

但是,在服务器端,它确实会引发错误,因为整数不能有尾零或句点。

在这种情况下,您可能应该去除尾随零。

你可以使用一个子字符串来剪切它,然后将它转换回一个整数。

例如:

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);

或者您可以将双精度转换为 int,如下所示:

(int) Double.parseDouble(dependentNum)

【讨论】:

  • 它仍然给我 NumberFormatException。
  • 我已经更新了答案以显示要在 servlet 中添加的内容。
  • 是的,我只是这样做。
  • @SamVitare 等一下 - 它对我来说非常有效。我添加了一个测试用例。
  • 我认为我的代码甚至没有达到条件。我正在经历它,试图让它发挥作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
相关资源
最近更新 更多