我正在用Java构建温度转换器。用户将在JTextField
中输入一个数字,使用JComboBox
选择其起始标签,然后使用JRadioButton
中的ButtonGroup
选择其结束标签。用户输入的数字可能具有不同的可能性。它可以是
JTextField
有一个方法getText()
,它返回字符串的值。然后将其转换为double,最后转换为所需的结束标签。由于必须将String转换为double,因此JTextField
中不允许使用字母字符。所以我使用正则表达式来解决这个问题。我目前有
String tempV = startTempValInput.getText();
if (tempV.matches("-?[0-9]+\\.[0-9]+")) {
// Code Here
}
但是,这不能识别单个或多个整数。如何修改它以包含整数?
答案 0 :(得分:2)
tempV.matches("-?[0-9]+(\\.[0-9]+)?")
打破它:
-?
- 这将匹配0或1的负数[0-9]+
- 这将匹配数字字符1次或多次(\\.[0-9]+)?
- 这会将可能的小数位与无穷大相匹配
\\.
- 这将匹配一段时间。需要双重转义,因为Java将正则表达式识别为普通字符串。这意味着你必须逃避反斜杠[0-9]+
- 这将匹配数字字符1次或多次()?
中,因为它是可选的小数位。如果您尝试使用-?[0-9]+\\.?[0-9]+
,则无法识别单个整数。它会将负数和句点视为可选项,但由于+
返回1或更多,因此至少需要两个整数。另一种选择是
tempV.matches("-?([0-9]+\\.)?[0-9]+")
答案 1 :(得分:0)
因为必须将String转换为double,所以在JTextField中不允许使用字母字符
2.0E3
怎么样?
我只会使用Double.parseDouble
,然后抓住NumberFormatException
:
try {
Double.parseDouble(inStr);
} catch (NumberFormatException e) {
// string doesn't represent a double
}
你可以用正则表达式自己做,但是需要考虑各种边缘情况:科学记数法(如上所示),领先+
等等。它当然可以管理,但为什么要编写代码来完成某些事情那已经为你做了什么?
答案 2 :(得分:0)
你可以用这个覆盖所有的基础:
编辑 - 确保某个位置,感谢@yshavit
^(?=\D*\d)(?=[\d.-]+$)-?\d*\.?\d*$
可以扩展到更多内容:
已修改 - 简化版本,不需要某些断言。
# (?i)^(?=[^e]*\d)[+-]?\d*\.?\d*(?:e[+-]?\d+)?$
# "(?i)^(?=[^e]*\\d)[+-]?\\d*\\.?\\d*(?:e[+-]?\\d+)?$"
(?i) # Case insensitive modifier
^ # Beginning of string
(?= [^e]* \d ) # Lookahead must be a digit (and before exponent)
[+-]? \d* \.? \d* # Consume correct numeric form
(?: e [+-]? \d+ )? # Consume correct exponent form
$ # End of string
答案 3 :(得分:0)
捕获大范围双输入的模式是:
^(?![+-]$|[-+]E|E|$|\.$)[+-]?\d*(\.?\d*)?(E-?\d+)?$
匹配边缘情况:
1
1.
.1
4E7
3.4E-5
+7.4
-5
查看live demo
。
因为每个术语都是可选的,所以需要采取负面展望来捕捉原本会匹配的退化案例。
请注意,此正则表达式不会阻止过度/不足流量,例如1E9999
,它太大而无法表示双倍。