2010-08-22 4 views

답변

36

일반적인 접근 방식은 그것이 또한 Double.valueOf(String) 문서 내부의 제안처럼 정규 표현식을 확인하는 것입니다.

거기에 제공된 (또는 아래에 포함 된) regexp는 모든 유효한 부동 소수점 케이스를 포함해야하므로, 더 미세한 포인트를 놓치게 될 것이기 때문에이를 연습 할 필요가 없습니다.

원하지 않는 경우 try catch은 계속 선택할 수 있습니다.

JavaDoc을 제안 정규 표현식은 아래에 포함되어 있습니다 : 다음과 같은

final String Digits  = "(\\p{Digit}+)"; 
final String HexDigits = "(\\p{XDigit}+)"; 
// an exponent is 'e' or 'E' followed by an optionally 
// signed decimal integer. 
final String Exp  = "[eE][+-]?"+Digits; 
final String fpRegex = 
    ("[\\x00-\\x20]*"+ // Optional leading "whitespace" 
    "[+-]?(" +   // Optional sign character 
    "NaN|" +   // "NaN" string 
    "Infinity|" +  // "Infinity" string 

    // A decimal floating-point string representing a finite positive 
    // number without a leading sign has at most five basic pieces: 
    // Digits . Digits ExponentPart FloatTypeSuffix 
    // 
    // Since this method allows integer-only strings as input 
    // in addition to strings of floating-point literals, the 
    // two sub-patterns below are simplifications of the grammar 
    // productions from the Java Language Specification, 2nd 
    // edition, section 3.10.2. 

    // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt 
    "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+ 

    // . Digits ExponentPart_opt FloatTypeSuffix_opt 
    "(\\.("+Digits+")("+Exp+")?)|"+ 

    // Hexadecimal strings 
    "((" + 
    // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt 
    "(0[xX]" + HexDigits + "(\\.)?)|" + 

    // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt 
    "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" + 

    ")[pP][+-]?" + Digits + "))" + 
    "[fFdD]?))" + 
    "[\\x00-\\x20]*");// Optional trailing "whitespace" 

if (Pattern.matches(fpRegex, myString)){ 
    Double.valueOf(myString); // Will not throw NumberFormatException 
} else { 
    // Perform suitable alternative action 
} 
+0

+1 - 예외를 잡는 것보다 훨씬 낫다. (내 절름발이 답 ...) – Starkey

+0

정확히 어떻게하나요? –

+2

@Louis Rhys - 답변의 문서 링크에 코드 예제가 있습니다. – Starkey

43

Double.parseDouble()은 try catch 블록으로 래핑 할 수 있습니다.

try 
{ 
    Double.parseDouble(number); 
} 
catch(NumberFormatException e) 
{ 
    //not a double 
} 
+7

구문 분석과 동일한 동작을 보장하기 때문에 필자가 선호하는 방법입니다. 커스텀 정규 표현식으로 가장자리의 경우를 간과하는 것은 매우 쉽습니다. –

+2

숫자를 입력하고 공백이 있으면 예외는 아닙니다. – giant91

+2

@ giant91 - 숫자를 자르면됩니다 :'number.trim()'. – 26hmkk

8

뭔가가 충분합니다 : -

String decimalPattern = "([0-9]*)\\.([0-9]*)"; 
String number="20.00"; 
boolean match = Pattern.matches(decimalPattern, number); 
System.out.println(match); //if true then decimal else not 
+2

사실 그것은 그것보다 복잡합니다. johannes wachter의 대답을보세요 –

+1

알겠습니다. Wachter가 제공 한 링크는 참으로 도움이됩니다. – CoolBeans

+0

안녕하세요, 이것은 double에 더 적합합니다 : String doublePattern = "([0-9]. *) \\. ([0-9]. *)"; – voodoo98

48

아파치는, 평소와 같이,의 형태로 Apache Commons-Lang에서 좋은 답변을 가지고 org.apache.commons.lang3.math.NumberUtils.isNumber(String)

null을 처리 할 때, try/catch 블록이 필요하지 않습니다.

+0

Apache는 일반적인 JDK와 함께 제공됩니까? –

+5

아니요. Apache Commons 라이브러리는 여기에서 찾을 수 있습니다. http://commons.apache.org/ 가능할 때마다 사용자 지정 코드를 작성하는 대신 사용하는 것이 좋습니다. –

+1

10 진수를 식별합니까? – TechCrunch

6

당신이 원하는 학업 수준에 따라 모든 대답은 정상입니다.

private static final Pattern DOUBLE_PATTERN = Pattern.compile(
    "[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)" + 
    "([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|" + 
    "(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))" + 
    "[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*"); 

public static boolean isFloat(String s) 
{ 
    return DOUBLE_PATTERN.matcher(s).matches(); 
} 

이 코드는 Double에 JavaDoc을 기반으로 : 정확하게 자바 사양을 준수하고자하는 경우 다음 사용합니다.

6

Google의 Guava 라이브러리는 Doubles.tryParse(String)이라는 유용한 도우미 메소드를 제공합니다. Double.parseDouble과 같이 사용하지만 문자열이 double로 구문 분석되지 않으면 예외를 throw하는 것이 아니라 null을 반환합니다.

관련 문제