我正在用Java开发一个应用程序并发现了这种奇怪的行为:
如果通过控制面板将区域设置格式设置为匈牙利语(系统默认值),我会收到此异常,但如果我将其设置为英语,则可以正常运行。也适用于我正在开发程序的虚拟Mandriva。
这是导致问题的代码段:
public String stattxt(){
double dt = time_avg();
double bpm = (Double.compare(dt, 0) == 0) ? 0 : msec2bpm(dt);
String s = "<html>Number of control points: " + timestamps.size() + "<br>Average dt: " +
Double.valueOf(new DecimalFormat("#.####").format(dt).toString()) + " ms<br>" +
"Average BPM: " + Double.valueOf(new DecimalFormat("#.####").format(bpm).toString()) + "<br> </html>";
return s;
}
其中time_avg()
和msec2bpm
都返回double(不是偶然的Double)值。
无论区域设置如何,我怎样才能完成这项工作?任何帮助将不胜感激。
答案 0 :(得分:1)
好像你正在使用
Double.valueOf(new DecimalFormat("#.####").format(dt).toString())
将一个数字四舍五入到小数点后4位,但这看起来像是一个黑客,并且由于区域化设置而失败(匈牙利可能使用小数点逗号,而不是小数点。)
所以,使用类似:
之类的圆形双打rounded = Math.round(original * 10000)/10000.0;
并且,如果要创建一个双舍入到4位小数的字符串,请使用String.format()
String.format("%.4f", original);
答案 1 :(得分:1)
看起来你应该跳过Double.valueOf
:
public String stattxt(){
double dt = time_avg();
double bpm = (Double.compare(dt, 0) == 0) ? 0 : msec2bpm(dt);
String s = "<html>Number of control points: " + timestamps.size() + "<br>Average dt: " +
new DecimalFormat("#.####").format(dt) + " ms<br>" +
"Average BPM: " + new DecimalFormat("#.####").format(bpm) + "<br> </html>";
return s;
}
答案 2 :(得分:0)
为什么要将String
转换为Double
然后再转换为String
?这样做:
public String stattxt(){
double dt=time_avg();
double bpm=(Double.compare(dt, 0)==0)?0:msec2bpm(dt);
String s="<html>Number of control points: "+timestamps.size()+"<br>Average dt: "+
new DecimalFormat("#.####").format(dt).toString()+" ms<br>"+
"Average BPM: "+Double.valueOf(new DecimalFormat("#.####").format(bpm).toString())+"<br> </html>";
return s;
}