2011-11-27 2 views
4

나는 속성 파일에서 정보를로드하려고에 발생하고 난 다음 코드가 : 첫 번째 줄은 잘 작동하는 동안 parseDouble는 NumberFormatException이

anInt = Integer.parseInt(prop.getProperty("anInt")); 
aDouble = Double.parseDouble(prop.getProperty("aDouble")); 

가, 두 번째는 내가 을 시도하고를 double 변수를로드하면 NumberFormatException이 발생합니다. 특정 예외 메시지는 다음과 같습니다

Exception in thread "main" java.lang.NumberFormatException: For input string: "78,5" 
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222) 
at java.lang.Double.parseDouble(Double.java:510) 
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:59) 
at Assignment1.BaseStation.main(BaseStation.java:83) 
+6

prop.getProperty ("aDouble")의 값은 무엇입니까? –

+0

56,5 – nikos

+0

과 같이 **. ** **, **. –

답변

17

당신은 당신이 Double.parseDouble()를 사용하여 분석하려는 경우 사용할 쉼표, 구분 기호로 마침표를 사용해야합니다. Double 클래스의 문서에서 다음과 같이 말합니다.

[정적] Java 언어 사양의 어휘 구조 섹션에 정의 된대로입니다. Java 언어 사양에서

:

있는 FloatingPointLiteral :

  • 자리. 숫자 선택 하 ExponentPart 선택 하 FloatTypeSuffix 선택 하
  • . 당신이 고려 로케일을 고려하려면 숫자 ExponentPart 선택 하 FloatTypeSuffix 선택 하
  • 자리 ExponentPart FloatTypeSuffix 선택 하
  • 자리 ExponentPart 선택 하 FloatTypeSuffix

, 당신은 java.text.NumberFormat 사용할 수 있습니다

NumberFormat nf = NumberFormat.getInstance(); 
double number = nf.parse(myString).doubleValue(); 
+0

아니요! 이것은 현지화에 의존합니다. –

+0

'Double.parseDouble()'은 자바 언어 에서처럼 정의를 사용합니다. Java에서 부동 소수점 리터럴은 쉼표가 아닌 마침표를 사용해야합니다. – Malcolm

+0

호버 크래프트가 맞습니다. 구분 기호로 쉼표를 사용하는 값은 현지화 설정에주의를 기울이면 올바르게 구문 분석됩니다. – mort

3

"." 일반적으로 쉼표 구분 기호로 사용됩니다.

Locale.setDefault(Locale.GERMAN); //German will do the trick, better to use your country code 

를하거나 '의 NumberFormat 클래스를 사용합니다 : 당신이 고수하려는 경우 ","당신은 현지화 설정을 변경해야합니다. 그것은 정말 잘 설명되어 있습니다 int this stackover flow thread

+1

Locale.setDefault()를 변경하면 경고가 표시되어 전체 JVM에 영향을 미칠 수 있습니다. 그런 다음 서블릿 컨테이너와 같은 컨테이너를 사용하는 경우 앱 (현지화 관련 코드)과 다른 앱을 인식해야합니다. –

+0

사실, 'NumberFormat'을 사용하는 것이 더 좋습니다. – mort

+4

-1 :'Locale.setDefault()'는 로케일을 고려하지 않기 때문에'Double.parseDouble()'에 영향을 미치지 않습니다. 내 대답은 OpenJDK 소스 코드에서 분명히 드러났으며 필자는 내 컴퓨터에서 확인했습니다. – Malcolm

4

일부 EU 회원국에서는 ","을 사용하고 싶습니다. 신중하게 현지화를 처리해야합니다.자바 API에서

봐는 valueOf에서 http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

, 그것은,

To interpret localized string representations of a floating-point value, use subclasses of NumberFormat. 

예를 들어,이 코드는,

NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN); 
double number = nf.parse(myString).doubleValue(); 

하나 중요한 것은 문제를 해결할 것이라고 말했다 당신 해야 같은 것을 사용하지 마십시오

Locale.setDefault(something); 

전체 JVM에 영향을 줄 수 있기 때문입니다. 다시 말해, 이는 현지화를 사용하는 다른 코드에 영향을 줄 수 있음을 의미합니다. 또한 Servlet Container와 같은 Container (예 : 공유 Tomcat 호스팅)를 사용하는 경우 동일한 JVM에있는 다른 응용 프로그램에 영향을 줄 수 있습니다.

대부분의 경우 로컬 컴퓨터에서 Locale.setDefault()와 같은 것을 사용할 수 있지만 다른 서버 (공유 톰캣 호스팅)에서는 배포 할 수 없습니다. JRE에 허용되지 않는 권한이 설정 될 수 있습니다. 그런 방법을하십시오. 꽤 좋은 호스팅 제공 업체 대부분이 이것을했다고 확신합니다. 이러한 코드를 호스팅 제공 업체의 공유 Tomcat에 배포 할 수 있다면 다른 호스팅 회사로 변경하는 것이 좋습니다.

관련 문제