Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个语言环境中将字符串解析为BigDecimal_Java_String_Parsing_Locale_Bigdecimal - Fatal编程技术网

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

Java 在多个语言环境中将字符串解析为BigDecimal,java,string,parsing,locale,bigdecimal,Java,String,Parsing,Locale,Bigdecimal,我必须将表示数字的字符串解析为BigDecimal。 我的问题是,我的用户可以在多个地区生成这些数字, 我无法事先知道我正在解析哪个区域设置。 例如,我可以得到: 1234 1.234 1234.56 1234,56 1.234,56 1'234.56 这些始终是货币,因此小数部分始终是0到2的数字。 有没有安全的方法来解析这些数字? 特别是,我担心在(例如)1.200(一千两百)和1.20(一美分和二十美分)之间进行区分是相当危险的 谢谢。您可以强制字符串正确表示double,然后解析它

我必须将表示数字的字符串解析为BigDecimal。 我的问题是,我的用户可以在多个地区生成这些数字, 我无法事先知道我正在解析哪个区域设置。 例如,我可以得到:

  • 1234
  • 1.234
  • 1234.56
  • 1234,56
  • 1.234,56
  • 1'234.56
这些始终是货币,因此小数部分始终是0到2的数字。 有没有安全的方法来解析这些数字? 特别是,我担心在(例如)1.200(一千两百)和1.20(一美分和二十美分)之间进行区分是相当危险的


谢谢。

您可以强制字符串正确表示double,然后解析它

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

您可以强制字符串正确表示double,然后解析它

    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.234”不起作用。这将返回“-12.34”,而不是通缉的“-1234,00”。哦,对不起,我以为总有2个小数,将修复答案。我担心这对(例如)“1.234”不起作用。这将返回“-12.34”,而不是通缉“-1234,00”。哦,对不起,我以为总有2个小数,将修复答案。谢谢。假设小数位数不超过2,这可能是一个很好的解决方案。我想要一个强壮的,结实的。例如,一个人可以很容易地判断出1'212'456.230不应该被解析为“1212456230,00”。我认为,如果找到两种分隔符,那么第二种是小数。否则,若分隔符不止一次被找到,则表示千。此外,我的意思是一个数字也只能有一个小数点。只要稍加修改,这个就可以工作了。再次感谢。我担心检查2个分隔符或重复分隔符也不会总是有效,例如1.200(一千二百)将被视为1.20(一美分和二十美分)。对于1.200,既没有重复分隔符,也没有2个分隔符。我的支票应该足够安全,只要至少有两个分离器。如果只有一个分离器,可以使用您的解决方案。谢谢。假设小数位数不超过2,这可能是一个很好的解决方案。我想要一个强壮的,结实的。例如,一个人可以很容易地判断出1'212'456.230不应该被解析为“1212456230,00”。我认为,如果找到两种分隔符,那么第二种是小数。否则,若分隔符不止一次被找到,则表示千。此外,我的意思是一个数字也只能有一个小数点。只要稍加修改,这个就可以工作了。再次感谢。我担心检查2个分隔符或重复分隔符也不会总是有效,例如1.200(一千二百)将被视为1.20(一美分和二十美分)。对于1.200,既没有重复分隔符,也没有2个分隔符。我的支票应该足够安全,只要至少有两个分离器。如果只有一个分离器,则可以使用该解决方案。