在我的Java代码中,我有四个文本格式的数字(String): ES。
String s1 = "1234.56";
String s2 = "1235,56";
String s3 = "1,234.56";
String s4 = "1.234,56";
我想将这些字符串转换为BigDecimal:
BigDecimal b1 = new BigDecimal(s1);
...
...
显然它不起作用,因为BigDecimal不接受所有格式(带逗号的字符串)。 有一种通用的方法可以让我转换BigDecimal中的所有字符串吗?
答案 0 :(得分:1)
十进制部分依赖于区域设置,因此您可以使用 NumberFormat 类并将解析后的结果用作字符串从中获取BigDecimal
final NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
final Number number = format.parse("3,1415");
final BigDecimal bd = new BigDecimal(number.toString());
System.out.println(bd);
答案 1 :(得分:0)
DecimalFormat
怎么样? Doc here
在解析字符串之前,您只需要为小数点分隔符定义一个模式...
DecimalFormat decimalFormat = new DecimalFormat("#,###.##");
decimalFormat.setParseBigDecimal(true);
BigDecimal bigDecimal = (BigDecimal) decimalFormat.parse("1,234.56");
System.out.println(bigDecimal);
应该做的伎俩
答案 2 :(得分:0)
为了涵盖所有我建议遵循impl的案例:
private static BigDecimal convertToBigDecimal(String s) {
StringBuilder sb = new StringBuilder();
if (s.indexOf('.') != -1 && s.indexOf(',') != -1) {
s = s.replace(',', '.');
String[] ss = s.split("\\.");
for (int i = 0; i < ss.length; i++) {
if (i > 0 && i == ss.length - 1) {
sb.append('.');
}
sb.append(ss[i]);
}
} else if (s.indexOf('.') != -1) {
String[] ss = s.split("\\.");
if (ss.length > 2) {
sb.append(s.replace(".", ""));
} else {
// assume it is decimal delimiter
sb.append(ss[0]).append('.').append(ss[1]);
}
} else if (s.indexOf(',') != -1) {
String[] ss = s.split(",");
if (ss.length > 2) {
sb.append(s.replace(",", ""));
} else {
// assume it is decimal delimiter
sb.append(ss[0]).append('.').append(ss[1]);
}
}
BigDecimal bd = new BigDecimal(sb.toString());
return bd;
}
首先检查一下我们是否同时拥有小数部分,然后将所有,
替换为.
,然后跳过除最后一个之外的所有.
。否则,如果我们有几个相同的分隔符,则它是没有小数部分的数字。在其他情况下,我们需要知道模式以区分小数与否。对于样本数,我们假设它是带小数的。