我必须将代表数字的String解析为BigDecimal。 我的问题是我的用户可能会在多个语言环境中产生这些数字, 我无法事先知道我要解析哪个语言环境。 例如,我可以得到:
这些始终是货币,因此小数部分始终是0到2的数字。 有解析这些数字的安全方法吗? 特别是,我担心在(例如)1.200(一千两百)和1.20(一和二十美分)之间进行区分非常危险。
谢谢。
答案 0 :(得分:1)
您可以强制您的String正确表示双精度,然后对其进行解析
public static String getCurrency(String val) {
// if val doesn't have decimal part ex 1234 or 1.234 (I suppose only 2 decimal values are allowed, usually the case with currencies
if( val.charAt(val.length()-3) != '.' && val.charAt(val.length()-3) != ',' ) {
val = val + ".00";
}
// get rid of . , ' ...
val = val.replaceAll("[^0-9]", "");
// add the point to mark the decimal part
val = val.substring(0, val.length()-2) + "." + val.substring(val.length()-2);
return val;
}
测试:
String str1 = "1.234,56";
String str2 = "1'234.56";
String str3 = "1234.56";
String str4 = "1.234";
String str5 = "1234";
String str6 = "1234,56";
System.out.println (getCurrency(str1));
System.out.println (getCurrency(str2));
System.out.println (getCurrency(str3));
System.out.println (getCurrency(str4));
System.out.println (getCurrency(str5));
System.out.println (getCurrency(str6));
打印:
1234.56
1234.56
1234.56
1234.00
1234.00
1234.56
答案 1 :(得分:0)
String str = "-1.234,5";
BigDecimal number = new BigDecimal(
str.replaceAll("([^0-9-][0-9]{0,2})$|[^0-9-]", "$1")
.replaceAll("[^0-9-]", "."));
System.out.println(number); // Will print "-1234.5"