NumberFormatException:无效的双倍:“2”
问题描述:
经过简单的划分后,我尝试将结果四舍五入到小数点后两位。一切工作正常,但在某些设备上,作为分割的结果,我得到了这个符号“2”。当我尝试将它舍入到小数点后两位时,此符号会导致数字格式异常。 有人能向我解释为什么发生这种情况,我怎么能解决这个问题NumberFormatException:无效的双倍:“2”
我的代码:
double total = 0;
double average = 0;
for (HashMap.Entry<String, Double> entry : ratings.entrySet()) {
String person = entry.getKey();
Double rating = entry.getValue();
total += rating;
}
average = total/ratings.size();
ratingsDisplay.setTitleText(roundTo2Decimals(average) + "");
public double roundTo2Decimals(double val) {
DecimalFormat df2 = new DecimalFormat("###.##");
return Double.valueOf(df2.format(val)); <== this is where the crash happens
}
错误日志:
0java.lang.NumberFormatException: Invalid double: "٢"
1at java.lang.StringToReal.invalidReal(StringToReal.java:63)
2at java.lang.StringToReal.initialParse(StringToReal.java:164)
3at java.lang.StringToReal.parseDouble(StringToReal.java:282)
4at java.lang.Double.parseDouble(Double.java:301)
5at java.lang.Double.valueOf(Double.java:338)
6at com.ducky.flipplanet.ToonViewer.roundTo2Decimals(ToonViewer.java:2750)
7at com.ducky.flipplanet.ToonViewer.calculateAndShowRatings(ToonViewer.java:2919)
8at com.ducky.flipplanet.ToonViewer.loadFromDocId(ToonViewer.java:2850)
9at com.ducky.flipplanet.ToonViewer$79.onDataChange(ToonViewer.java:4816)
10at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:53)
11at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
12at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
13at android.os.Handler.handleCallback(Handler.java:739)
14at android.os.Handler.dispatchMessage(Handler.java:95)
15at android.os.Looper.loop(Looper.java:145)
16at android.app.ActivityThread.main(ActivityThread.java:5938)
17at java.lang.reflect.Method.invoke(Native Method)
18at java.lang.reflect.Method.invoke(Method.java:372)
19at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
20at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
答
,你得到的字符被称为Unicode中的ARABIC-INDIC DIGIT TWO
。
这里是另一个数字:解决这个问题正在取代三位数replace
把他们变成英语
٠ 0
١ 1
٢ 2
٣ 3
٤ 4
٥ 5
٦ 6
٧ 7
٨ 8
٩ 9
的一种方式。但是,这可能不适用于某些情况。另外,你应该知道世界上还有其他数字系统。
因此,您应该将十进制格式的语言环境设置为en_US
。这样,没有怪异的角色会出来。
DecimalFormat formatter = (DecimalFormat) DecimalFormat.getNumberInstance(Locale.US);
formatter.applyPattern("###.##");
String fString = formatter.format(100);
System.out.println(fString);
答
d = Double.parseDouble(new DecimalFormat("####.00").format(d).replace("٠", "0")
.replace("١", "1").replace("٢", "2").replace("٣", "3")
.replace("٤", "4").replace("٥", "5").replace("٦", "6")
.replace("٧", "7").replace("٨", "8").replace("٩", "9")
.replace("٫", "."));
//基于扫地答案:)
“2”符号的阿拉伯数字。即等于2,因此在进行任何操作之前将其转换为正常状态 – shahid17june
@ shahid17june Thankyou作为指针;但是我如何知道他们处于错误的状态,以及如何将其转换为正确的状态。 –
这将有助于你 https://stackoverflow.com/questions/22778734/arabic-digit-to-english-digit-android 只是做谷歌有很多问题已经存在这样的很多 – shahid17june