在多个语言环境中将字符串解析为BigDecimal

时间:2019-03-22 09:29:47

标签: java string parsing locale bigdecimal

我必须将代表数字的String解析为BigDecimal。 我的问题是我的用户可能会在多个语言环境中产生这些数字, 我无法事先知道我要解析哪个语言环境。 例如,我可以得到:

  • 1234
  • 1.234
  • 1234.56
  • 1234,56
  • 1.234,56
  • 1'234.56

这些始终是货币,因此小数部分始终是0到2的数字。 有解析这些数字的安全方法吗? 特别是,我担心在(例如)1.200(一千两百)和1.20(一和二十美分)之间进行区分非常危险。

谢谢。

2 个答案:

答案 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"