我必须将德语区域设置格式化的String转换为BigDecimal。但是,我正在努力寻找最佳解决方案。
以下代码显示了我的问题:
String numberString = "2.105,88";
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
try {
Number parsed = nf.parse(numberString);
BigDecimal bd1 = new BigDecimal(parsed.toString());
System.out.println(bd1.toString());
BigDecimal bd2 = new BigDecimal(parsed.doubleValue());
System.out.println(bd2);
BigDecimal bd3 = new BigDecimal(numberString);
System.out.println(bd3);
} catch (ParseException e) {
e.printStackTrace();
}
这次的出局是
2105.88
2105.8800000000001091393642127513885498046875
线程“main”java.lang.NumberFormatException中的异常 在java.math.BigDecimal。(未知来源) 在java.math.BigDecimal。(未知来源) at test.BigDecimalTest.main(BigDecimalTest.java:22)
第一个输出是正确的,但将String
转换为Number
(确切地说是Double
)然后回到{{1}并不合理然后再转换为特定类型的String
,Number
。
第二个输出不正确,但可以通过设置BigDecimal的比例来解决。但是,数字量并不总是已知。
第三项输出显然不是我想要的。
我的问题是,最好的方法是什么?有更好的方法吗?
答案 0 :(得分:32)
似乎没有其他办法,因为java.Lang.Number没有返回BigDecimal类型的方法。无论如何它是有道理的,因为BigDecimal只接受格式正确的字符串,不像“”2.105,88“但像”2105.88“ 让我展示你的代码:
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class JavaMain {
public static void main(String[] args) {
String numberString = "2.105,88";
//using casting
try {
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.GERMAN);
df.setParseBigDecimal(true);
BigDecimal bd = (BigDecimal) df.parseObject(numberString);
System.out.println(bd.toString());
} catch (ParseException e) {
e.printStackTrace();
}
//your way short version
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
try {
BigDecimal bd1 = new BigDecimal(nf.parse(numberString).toString());
System.out.println(bd1.toString());
} catch (ParseException e) {
e.printStackTrace();
}
String numberStringFixed = "2105.88";
//direct string formated
System.out.println(new BigDecimal(numberStringFixed));;
//direct but erroneous way if the string is not formated
System.out.println(new BigDecimal(numberString));;
}
}
我希望这有帮助!
答案 1 :(得分:10)
DecimalFormat
有一个名为setParseBigDecimal
的方法会导致parse()
返回BigDecimal
。您只需要转换返回的Number
。
答案 2 :(得分:-4)
问题是String的格式。你应该使用第三种方法,但是格式化你的字符串:String numberString = "2105.88";
您可以从这里给出的示例中看到这一点: Link to Java Api
编辑: 好的,所以我看到了两种可能的解决方案。要么使用您的解决方案1(这是我更喜欢的),要么执行以下操作:
numberString = numberString.replaceAll(".", "");
numberString = numberString.replaceAll(",", ".");
BigDecimal bd3 = new BigDecimal(numberString);