2013-03-22 4 views
3


필자는 프리미티브의 문자열 표현을 가지고 있으며 내 목표는 어떤 프리미티브인지 결정하는 것입니다. (입력이 "223.1"또는 심지어 "223.0"경우
String 표현에서 기본 유형을 결정하는 방법은 무엇입니까?

public Object getPrimitive(String primitiveAsString) { 
..... 
} 

그래서 난 경우 정수를 반환하고 싶습니다 예를 들어 입력이 "223"하지만 이중 다음과 같이
내 기능입니다 !!). 게다가 float와 double, 정수와 "BigInteger"사이에서도 구분하고 싶습니다.

NumberFormat을 사용하여 솔루션을 시도했지만 나에게 적합하지 않았습니다. ...

이렇게 우아한 방법이 있습니까?

감사!

+3

아니요, 그것에 대해 우아한 방법이 없습니다. –

+2

어떤 기본 유형을 지원해야합니까? – NPE

+0

어떤 식 으로든 정수의 문자열 표현과 BigInteger의 표현을 구별 할 수 있습니까 (값이 MAX_INT & MIN_INT 사이에있는 한)? – Erik

답변

0

아이디어는 try-catch에서 각 유형을 반환하려고합니다.

코드 (에러 체킹 이상적보다 작을 수있다)

public static void main(String[] args) 
{ 
    System.out.println(getPrimitive("123")); // Byte 
    System.out.println(getPrimitive("1233")); // Short 
    System.out.println(getPrimitive("1233587")); // Integer 
    System.out.println(getPrimitive("123.2")); // Float 
    System.out.println(getPrimitive("123.999999")); // Double 
    System.out.println(getPrimitive("12399999999999999999999999")); // BigInteger 
    System.out.println(getPrimitive("123.999999999999999999999999")); // BigDecimal 
} 

static public Object getPrimitive(String string) 
{ 
    try { return Byte.valueOf(string);  } catch (Exception e) { }; 
    try { return Short.valueOf(string);  } catch (Exception e) { }; 
    try { return Integer.valueOf(string); } catch (Exception e) { }; 
    try { return new BigInteger(string);  } catch (Exception e) { }; 
    try { if (string.matches(".{1,8}")) 
      return Float.valueOf(string); } catch (Exception e) { }; 
    try { if (string.matches(".{1,17}")) 
      return Double.valueOf(string); } catch (Exception e) { }; 
    try { return new BigDecimal(string);  } catch (Exception e) { }; 
    // more stuff ? 
    return null; 
} 

.{1,8}.{1,17} 뒤에 추론 floatdouble 각 (어떤 임의의 소스에 따라 약 7, 16 자리 정확하다는 것이다). .은 와일드 카드입니다. {x,y}은 x와 y 사이에서 반복된다는 것을 의미합니다.

편집 : 무엇보다도 기본 정규식 float, doubleBigDecimal 차별화를 개선

.

+0

Integer.parseInt() 자체가 정수로 올바르게 구문 분석하므로 Number가 BigInteger/BigDecimal에 속하는 수를 어떻게 결정할 것입니까? –

+0

@Ankur'12399999999999999999999999'는'Integer'에 들어갈 수있는 것보다 크기 때문에'BigInteger'로 넘어갑니다. – Dukeling

+0

숫자가 작은 경우 어떻게됩니까? 아직도 BigInteger에 속할 수 있습니다. –

0

나는 이것을 매우 쉽게 할 수 있을지 의심 스럽다. 문자열의 내용이 정수 또는 BigInteger에 속하는지 여부를 감지하는 것은 매우 까다 롭거나 거의 불가능합니다. 물론 int와 double/float을 구별하여 정규식을 작성하여 '을 포함하는지 확인할 수 있습니다.'이고 나머지 문자는 숫자입니다.

0

나는 이렇게 할 것이다 ... 이것은 BigInteger와 BigDecimal에서도 잘 작동 할 것이다.

public Object getPrimitive(String primitiveAsString) { 
    String value = primitiveAsString; 

    try { 
     return Byte.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Short.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Integer.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Float.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Double.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return Long.valueOf(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return new BigInteger(value); 
    } catch (NumberFormatException ex) { } 

    try { 
     return new BigDecimal(value); 
    } catch (NumberFormatException ex) { } 

    if(value.length() == 1) { 
     return new Character(value.charAt(0)); 
    } 

    return null; 
} 

EDIT는 : 입력이 인 BigInteger/BigDecimal의 경우 케이스 맞추 용액을 향상시켰다. 이 솔루션은 어떤 정규식을 사용하지 않습니다.

+1

주문이 잘못되어 Byte와 Short가 모두 실행되지 않습니다 (Byte와 Short도 모두 정수입니다.) 또한 Float (Double로 덮여 있음) . – Dukeling

+0

공정한 점. 포인터 주셔서 감사합니다. 변경했습니다. – vijay

+0

'Double' 또는'BigDecimal'을 반환하는 테스트 케이스를 찾으십시오.'Float'은 모든 것을 커버 할 것입니다 (무겁게 반올림하더라도). 당신은 정규식이 필요합니다. – Dukeling

관련 문제