2012-09-04 4 views
4

Robolectric에서 일부 코드, 즉 IntegerResourceLoader을 만들고 있습니다.16 진수 색상 문자열을 정수로 구문 분석하는 방법

@Override 
public Object convertRawValue(String rawValue) { 
    try { 
     return Integer.parseInt(rawValue); 
    } catch (NumberFormatException nfe) { 
     throw new RuntimeException(rawValue + " is not an integer."); 
    } 
} 

내가 Integer.decode(String)를 사용하여 시도하지만 문법이 올 것으로 보인다에도 NumberFormatException이 예외 : rawValue0xFFFF0000과 같은 일이있을 때 다음 방법은 RuntimeException을 던지고있다.

답변

6

decode()은 올바른 호출 방법이지만 0xFFFF0000이 integer의 최대 한도 인 0x7fffffff보다 높기 때문에 실패합니다. Long을 고려할 수도 있습니다.

+1

맞습니다. Long.decode()는이 문제를 해결합니다. 고맙습니다. –

1

앞에서 0x를 제거 할 수 있다면 parseInt()의 기수를 설정할 수 있습니다. 그래서

Integer.parseInt(myHexValue,16)

+0

Integer.decode 당신을위한 것으로한다. –

2

다음 방법을 던지고 자세한 내용은 http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String, int)를 참조하십시오 RuntimeExceptionrawValue0xFFFF0000

같은 일이 Integer.parseInt가 처리하도록 설계되지 않기 때문입니다 때 0x 접두어.

Integer.decode (String)을 사용했지만 문법이 올바른 것처럼 보였지만 NumberFormatException을 throw합니다.

문자의이 시퀀스는 양의 값을 아니면 안되어, 그렇지 않은 경우는 NumberFormatException이 발생합니다 : (귀하의 질문에 연결된) Integer.decode의 Javadoc에서

.

은 음수이며 여기에 예외가 발생하는 원인이 될 수 있습니다.

해결 방법 : 주어진 값이 형태 0x[hexdigits] 될 것이라는 점을 알고 있다면

, 당신은 기수 소요 Integer.parseInt(String, int)를 사용할 수 있습니다.

return Integer.parseInt(rawValue.split("[x|X]")[1], 16); 

이 소문자 또는 대문자 중 'X'캐릭터 rawValue 분리 할 문자열을 분할 정규식 [x|X] 사용은 다음을 통과 : 16 진수를 들어, 기수 (16)과 같이 인 16 진수로 분석하려면 기수가 16 진수 인 parseInt으로 변경하십시오.

+1

0x를 안다면 색상을 변환 할 때마다 정규식을 컴파일하는 split을 사용할 필요가 없으며 대신'O (1)'연산을 사용할 수 있습니다 :'parseInt (rawValue.substring (2))'. 자바 문자열은'substring'에 최적화되어 있습니다 ('java.lang.String'의'offset'와'count' 필드 참조) – TWiStErRob

+1

그건 작동하지 않습니다. 나는 그것을 시도했다. java.lang.NumberFormatException : Invalid int : "98E91E63"whre 98 is Alpha – sud007

+0

@ sud007 내 솔루션에서는 문자열이 "0x98E91E63"이어야합니다. 그렇지 않으면 Integer.parseInt ("98E91E63", 16)'를 사용하여 정수를 구문 분석 할 수 있습니다. – Brian

2

이 안드로이드 그것을 수행하는 방법입니다

private int parseColor(String colorString) { 
    if (colorString.charAt(0) == '#') { 
     // Use a long to avoid rollovers on #ffXXXXXX 
     long color = Long.parseLong(colorString.substring(1), 16); 
     if (colorString.length() == 7) { 
      // Set the alpha value 
      color |= 0x00000000ff000000; 
     } else if (colorString.length() != 9) { 
      throw new IllegalArgumentException("Unknown color"); 
     } 
     return (int)color; 
    } 
    throw new IllegalArgumentException("Unknown color"); 
} 
관련 문제