我如何解释“,”和“。”确保String是有效的双精度?

时间:2014-02-11 15:15:37

标签: java

我正在尝试确保给定的字符串是有效的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.我想知道如何解决这些案件的最佳方法。

5 个答案:

答案 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

之后你可以解析它为双倍。