[英]Formatting BigDecimal to Locale specific Currency String using Locale(languageCode, countryCode)
[英]Best way to convert Locale specific String to 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
线程“main”中的异常 java.lang.NumberFormatException at java.math.BigDecimal.(Unknown Source) at java.math.BigDecimal.(Unknown Source) at test.BigDecimalTest.main(BigDecimalTest.java:22)
第一个输出是正确的,但将String
转换为Number
(准确地说是Double
),然后再次转换为String
,然后转换为特定类型的Number
, BigDecimal
并没有真正意义。
第二个输出不正确,但可以通过设置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 formatted
System.out.println(new BigDecimal(numberStringFixed));;
//direct but erroneous way if the string is not formatted
System.out.println(new BigDecimal(numberString));;
}
}
我希望这有帮助!
DecimalFormat
有一个名为setParseBigDecimal
的方法,它导致parse()
返回一个BigDecimal
。 您只需要投射返回的Number
。
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
是在 Java 1.5 中引入的。
我必须将德国语言环境格式的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.lang.NumberFormatException。(未知源)at test.BigDecimalTest.main(BigDecimalTest.java:22)处的java.math.BigDecimal(未知源)。
第一个输出是正确的,但是将String
转换为Number
(精确地说是Double
),然后再次返回String
,然后转换为Number
的特定类型BigDecimal
并没有多大意义。
第二个输出不正确,但是可以通过设置BigDecimal
的小数BigDecimal
来解决。 但是,数字量并不总是已知的。
第三输出显然不是我想要的。
我的问题:最好的方法是什么? 有更好的方法可以做到这一点吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.