Java 将特定于语言环境的字符串转换为BigDecimal的最佳方法
我必须将格式为Java 将特定于语言环境的字符串转换为BigDecimal的最佳方法,java,bigdecimal,Java,Bigdecimal,我必须将格式为String的德语区域设置转换为BigDecimal。然而,我正在努力寻找最好的解决方案 以下代码显示了我的问题: String numberString = "2.105,88"; NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN); try { Number parsed = nf.parse(numberString); BigDecimal bd1 =
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.8800000000010913936421275138854549046875
线程“main”java.lang.NumberFormatException中出现异常
位于java.math.BigDecimal。(未知源)
位于java.math.BigDecimal。(未知源)
main(BigDecimalTest.java:22)
第一个输出是正确的,但将字符串
转换为数字
(Double
,准确地说),然后再次转换为字符串
,然后转换为特定类型的数字
,大十进制
第二个输出不正确,但可以通过设置BigDecimal
的比例来解决。但是,位数并不总是已知的
第三个输出显然不是我想要的
我的问题是:最好的方式是什么?有更好的方法吗?问题在于字符串的格式。您应该使用第三种方法,但字符串的格式如下:
stringnumberstring=“2105.88”代码>
您可以从以下示例中看到这一点:
编辑:
好的,我看到了两种可能的解决方案。要么使用您的解决方案1(这是我喜欢的),要么执行以下操作:
numberString = numberString.replaceAll(".", "");
numberString = numberString.replaceAll(",", ".");
BigDecimal bd3 = new BigDecimal(numberString);
似乎没有其他方法,因为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 formatted
System.out.println(new BigDecimal(numberStringFixed));;
//direct but erroneous way if the string is not formatted
System.out.println(new BigDecimal(numberString));;
}
}
我希望这有帮助 DecimalFormat
有一个名为的方法,该方法使parse()
返回一个BigDecimal
。您只需强制转换返回的编号
String numberString = "2.105,88";
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
if (nf instanceof DecimalFormat) {
DecimalFormat df = (DecimalFormat) nf;
df.setParseBigDecimal(true);
BigDecimal parsed = (BigDecimal) df.parse(numberString);
System.out.println(parsed);
}
输出:
2105.88
setParseBigDecimal
是在Java1.5中引入的。这不起作用。字符串必须使用德语语言环境进行格式化。这就是我使用数字格式的原因。如果你找到更好的方法,请告诉我。我很感兴趣。请不要像这样传播代码。已经有足够多的人不知道数字格式和地区。看到你的代码使他们不再阅读!至于“格式正确”2.105,88
实际上在许多地区都是完全正确格式的。。。在这些地区,2105.88
根本不合适。整个考验需要的是BigDecimal构造函数的区域设置参数…@JarettMillard实际上DecimalFormat
有,NumberFormat
没有这个method@deFreitasNumberFormat
是一个抽象类。DecimalFormat
的文档明确告诉您使用NumberFormat.getInstance()
“NumberFormat是一个抽象类”,它没有这样的方法,这意味着您必须将工厂方法的结果转换回DecimalFormat。