2014-02-11 24 views
1

我试图确保给定的字符串是一个有效的双。这类问题的大多数答案建议使用Double.parseDouble(inputString)。然而,这并不像我希望的那样健壮。例如,如果我输入一个字符串,如“1one”Double.parseDouble("1one")将输出“1”而不是返回无效双精度的例外。如何解释“,”和“。”当确保一个字符串是一个有效的双?

我已经尝试通过遍历字符串,并确保每一个数字是一个数字来解决这个问题:

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

检查是否只有数字,只有一个或零,','或'.'不在字符串的末尾? –

+1

正则表达式来验证它? – Randy

+1

你确定'parseDouble'为'1one'工作吗? – Maroun

回答

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) 
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*/ 
+0

这不会为“1one”引发异常 –

-1

我会用Double.parseDouble,因为,相反你所相信的,它抛出一个NumberFormatException1one

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任何,.与语言环境指定decmial点。

-2

使用简单的regex,你可以检查它是否包含任何非数字字符,像这样:

String input = "1one2"; 
String numerical = input.replaceAll("[^0-9.]", ""); 
if (input.equals(numerical)) // If you remove all non numbers, still the same string 

后,你可以分析它双。

相关问题