Java 使用DecimalFormat将double格式化为字符串会引发IllegalArgumentException

Java 使用DecimalFormat将double格式化为字符串会引发IllegalArgumentException,java,android,Java,Android,我在市场上有一个Android应用程序,它使用这段代码将字符串转换为double。该字符串具有验证,以检查它是否为真正的十进制值。这在大多数情况下运行良好,但偶尔会抛出异常。我敢肯定这是本地化问题,这是由不使用美国英语的设备引起的 [在大多数情况下,我知道该值为0。] 这是我的密码。if-else块中的代码引发异常 DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("en", "en")); symbols.se

我在市场上有一个Android应用程序,它使用这段代码将字符串转换为double。该字符串具有验证,以检查它是否为真正的十进制值。这在大多数情况下运行良好,但偶尔会抛出异常。我敢肯定这是本地化问题,这是由不使用美国英语的设备引起的

[在大多数情况下,我知道该值为0。]

这是我的密码。if-else块中的代码引发异常

DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("en", "en"));
symbols.setDecimalSeparator('.');
DecimalFormat df = new DecimalFormat("#.##", symbols);
double temperature = Double.valueOf(numberString);
if (tempUnits.equals("f")) {
    mBBTValue.setText(df.format(temperature) + " °F");
} else {
    mBBTValue.setText(df.format(getTemperatureInCelcius(temperature) + " °C"));
}
此代码在某些国家/地区引发以下异常

java.lang.IllegalArgumentException
at java.text.NumberFormat.format(NumberFormat.java:304)
at java.text.DecimalFormat.format(DecimalFormat.java:702)
at java.text.Format.format(Format.java:93)
at com.mysa.DetailsActivity$InitTask.onPostExecute(DayDataDetailsActivity.java:543)
at com.mysa.DetailsActivity$InitTask.onPostExecute(DayDataDetailsActivity.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:4787)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
at dalvik.system.NativeStart.main(Native Method)
有人能解释一下我在这段代码中做错了什么吗。

你需要打电话给我

mBBTValue.setText(df.format(getTemperatureInCelcius(temperature)) + " °C");
而不是

mBBTValue.setText(df.format(getTemperatureInCelcius(temperature) + " °C"));

注意闭合支架的不同位置。您当前的版本在格式化之前附加
“°C”
,而不是格式化数字,然后附加
“°C”

//DecimalFormat df=new DecimalFormat(“#.##,符号”);引起问题

要获取特定区域设置(包括默认区域设置)的NumberFormat,请调用NumberFormat的工厂方法之一,例如getInstance()。通常,不要直接调用DecimalFormat构造函数,因为NumberFormat工厂方法可能返回DecimalFormat以外的子类。如果需要自定义format对象,请执行以下操作:

NumberFormat f=NumberFormat.getInstance(loc); if(f DecimalFormat的instanceof){ ((DecimalFormat)f).设置DecimalSeparatoralwaysShown(true); }


十进制格式包括一个模式和一组符号。可以直接使用applyPattern()设置模式,也可以间接使用API方法设置模式

getTemperatureInCelcius
返回什么?感觉您应该能够提供一个简短但完整的示例,它只进行格式化,而不需要获取温度等其他代码。在我看来,不要使用
DecimalFormat
;请改用
String.format()
。谢谢你们的帮助。问题在于我的括号的顺序,正如下面被接受的答案所提到的。哦,我犯了一个愚蠢的错误。谢谢你的接球。需要移动到编写单元测试:)。