2017-12-21 15 views
3

이 문제로 도와주세요. 코드 스 니펫과 충돌 로그를 여기에 추가하고 있습니다.NumberFormatException : 입력 문자열 : "5,2"

코드 :

if (rssi <= -30 && rssi >= -90) { 
    double len = ((rssi + 20) * -1)/10.0; 
    DecimalFormat decimalFormat = new DecimalFormat("#.##"); 
    float twoDigitsF = Float.valueOf(decimalFormat.format(len)); 
    return String.valueOf(twoDigitsF); 
} 

내가 내 로그

Fatal Exception: java.lang.NumberFormatException: For input string: "5,2" 
     at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1306) 
     at java.lang.Float.valueOf(Float.java:424) 
     at com.app.package.utils.Util.getRange(Util.java:26) 
     at com.app.package.DriverActivity.scanDone(SampleActivity.java:982) 
     at com.app.package.DriverActivity.access$1300(SampleActivity.java:126) 
     at com.app.package.DriverActivity$11.onScanned(SampleActivity.java:913) 
     at com.appchannel.bluetooth.BHelper$1.run(BHelper.java:67) 
     at android.os.Handler.handleCallback(Handler.java:751) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:154) 
     at android.app.ActivityThread.main(ActivityThread.java:6317) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 

내가 Crashlytics에서이 로그를 가지고 부착하고있는 라인 여기

float twoDigitsF = Float.valueOf(decimalFormat.format(len)); 

에서 예외를 얻고있다. 내 장치에서이 문제를 재현 할 수 없습니다.

+0

'5,2'는 "일반적인 Java float"을 따르지 않습니다. 여기에 숨어있는 "현지화"에 대한 질문이있을 수 있습니다. 이상적으로 코드는 DecimalFormat을 중간 단계로 사용하지 않고 * 표시 *를 생성하는 데 사용합니다. 여기에서는 중간 단계로만 사용되며 최종 결과 *에는 두 개의 후행 숫자가있을 수 있습니다. – user2864740

+0

즉 :'return decimalFormat.format (len);'으로 충분해야합니다. 장치의 현지화 설정에 따라 "5,2"또는 이와 비슷한 값이 반환됩니다. – user2864740

+0

현지화에 문제가 있습니다. 이 double 값이 쉼표로 구분 된 문자열 (5,2)로 바뀌는 방식으로 포맷터에 double 값을 전달합니다. 현지화가 진행된다면 어떻게 해결할 수 있습니까? – SunSun

답변

2

로케일로 설정 내용에 따라, 정수 부분과 소수의 소수 부분 사이의 문자가 될 수 있습니다 ., 내가 잘 모르는 것 같아요 다른 ,, 또는 뭔가.

DecimalFormat은 로케일에 해당하는 문자를 자동으로 사용하므로 5.2 대신 5,2과 같은 형식으로 표시됩니다.

그러나 valueOf은 로캘을 고려하지 않습니다. 구분자로 .을 찾습니다. 따라서 5,2 in there, valueOf`를 인식 할 수 없습니다.

그래서 결과는 valueOf와 호환되는지 서식을 진수 형식을 강제로이 함께 DecimalFormat을 만들려고 :

new DecimalFormat("#.##", DecimalFormatSymbols.getInstance(Locale.US)); 

편집 : 나는 당신이 다시 부동 소수점으로 변환 것을보고

다시 문자열을 반환합니다. 반환 값을 format으로 돌려 주시겠습니까?

return decimalFormat.format(len); 
0

5,2는 오류 값을 필터링해야합니다. tosetting textview inputtype!

0

10 진수 형식을 사용할 필요가 없습니다.

yourfloat*=100f; 
yourfloat = Math.round(yourfloat); 
yourfloat = yourfloat/100f;