将Locale特定String转换为BigDecimal的最佳方法

我必须将德语区域设置格式化的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

java.math.BigDecimal(java)中的线程“main”java.lang.NumberFormatException中的exception。在test.BigDecimalTest.main(BigDecimalTest.java:22)的java.math.BigDecimal。(未知来源)

第一个输出是正确的,但将String转换为Number (精确地为Double ),然后再将String转换为String然后转换为特定类型的NumberBigDecimal并没有多大意义。

第二个输出不正确,但可以通过设置BigDecimal的比例来解决。 但是,数字量并不总是已知。

第三个输出显然不是我想要的。

我的问题是,最好的方法是什么? 有没有更好的方法来做到这一点?

似乎没有其他办法,因为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));; } } 

我希望这有帮助!

DecimalFormat有一个名为setParseBigDecimal的方法,它使parse()返回一个BigDecimal 。 你只需要转换返回的Number

问题是String的格式。 你应该使用第三种方法,但是像这样格式化你的字符串: String numberString = "2105.88";

您将能够从这里给出的示例中看到这一点: 链接到Java Api

编辑:好的,所以我看到了2个可能的解决方案。 你可以选择你的解决方案1(这是我更喜欢的)或做类似的事情:

 numberString = numberString.replaceAll(".", ""); numberString = numberString.replaceAll(",", "."); BigDecimal bd3 = new BigDecimal(numberString);