我正在尝试确保给定的字符串是有效的double。对此类问题的大多数答案建议使用Double.parseDouble(inputString)
。然而,这并不像我希望的那样强大。例如,如果我输入一个字符串,例如“1one” Double.parseDouble("1one")
将输出“1”,而不是返回无效double的异常。
我试图通过迭代字符串并确保每个数字都是数字来解决这个问题:
for (int i = 0; i < number.length(); i++) {
previousChar = number.charAt(i);
if (!Character.isDigit(number.charAt(i))
&& number.charAt(i) != '.'
&& number.charAt(i) != ',') {
return null;
}
}
但是对于诸如“20..02”或“20,02”这样的情况,这只会返回20.我想知道如何解决这些案件的最佳方法。
答案 0 :(得分:3)
好问题。根据用户的不同,您可能需要注意区域设置之间的差异。有些地方使用,
作为千分隔符,其他地方使用小数点。您可以使用以下命令查找特定于语言环境的值:
DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance();
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
char decimalSeparator = symbols.getDecimalSeparator();
我建议为您的确切要求编写正则表达式,而不是手动进行匹配。如果您希望.
匹配.
而不是“任何字符”,请务必转义parseDouble
。
或者,您可以使用"1one"
,但似乎确实会为System.out.println(Double.parseDouble("1one"));
抛出异常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "1one"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
at java.lang.Double.parseDouble(Double.java:540)
对我来说,它产生:
{{1}}
答案 1 :(得分:1)
您可以使用Validator框架并使用DoubleValidator中的commons-validator。
DoubleValidator validator = DoubleValidator.getInstance();
validator.validate("1one");
答案 2 :(得分:0)
将字符串解析为双打充满了危险。例如,在法国,1,234是一个略大于1的数字。他们使用.
分隔数千和,
来表示小数部分的开头。
检查字符串是否为有效数字的最佳方法是使用NumberFormat
尝试解析它并将任何抛出的异常视为字符串不是有效数字的指示。 NumberFormat
允许您关联区域设置:
NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH/*for example*/);
double myNumber = nf.parse(myString); /*will throw an exception if not valid*/
答案 3 :(得分:-1)
我会使用Double.parseDouble
,因为,与您的信念相反,它会为NumberFormatException
投放1one
。
public class k {
public static void main(String argv[]) {
double d = Double.parseDouble("1one");
}
}
输出:
Exception in thread "Main Thread" java.lang.NumberFormatException: For input string: "1one"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
at java.lang.Double.parseDouble(Double.java:510)
at k.main(k.java:3)
如果我想同时允许,
和.
,而不仅仅是区域设置指定的小数点,我会replace
任意,
和.
使用locale指定的decmial point。
答案 4 :(得分:-2)
使用简单的正则表达式,您可以检查它是否包含任何非数字字符,如下所示:
String input = "1one2";
String numerical = input.replaceAll("[^0-9.]", "");
if (input.equals(numerical)) // If you remove all non numbers, still the same string
之后你可以解析它为双倍。