Java 将字符串转换为大小数的一般方法

Java 将字符串转换为大小数的一般方法,java,numbers,decimal,number-formatting,bigdecimal,Java,Numbers,Decimal,Number Formatting,Bigdecimal,在Java代码中,我有四个文本格式的数字(字符串): 是的 我想将这些字符串转换为BigDecimal: BigDecimal b1 = new BigDecimal(s1); ... ... 显然它不起作用,因为BigDecimal不接受所有格式(带逗号的字符串)。 有一种通用方法允许我将所有字符串转换为BigDecimal?那么DecimalFormat呢 您只需在解析字符串之前为十进制分隔符定义一个模式 DecimalFormat decimalFormat = new Decimal

在Java代码中,我有四个文本格式的数字(字符串): 是的

我想将这些字符串转换为BigDecimal:

BigDecimal b1 = new BigDecimal(s1);
...
...
显然它不起作用,因为BigDecimal不接受所有格式(带逗号的字符串)。
有一种通用方法允许我将所有字符串转换为BigDecimal?

那么
DecimalFormat

您只需在解析字符串之前为十进制分隔符定义一个模式

 DecimalFormat decimalFormat = new DecimalFormat("#,###.##");
 decimalFormat.setParseBigDecimal(true);
 BigDecimal bigDecimal = (BigDecimal) decimalFormat.parse("1,234.56");
 System.out.println(bigDecimal);

应该做到这一点

小数部分始终依赖于语言环境,因此您可以使用NumberFormat类,并将解析结果用作字符串,从中获取一个BigDecimal

例子:
为了涵盖所有情况,我建议以下建议:

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;
}
私有静态BigDecimal转换为BigDecimal(字符串s){
StringBuilder sb=新的StringBuilder();
if(s.indexOf(‘.)!=-1和&s.indexOf(‘,’)!=-1){
s=s。替换(',',');
字符串[]ss=s.split(\\);
对于(int i=0;i0&&i==ss.length-1){
某人附加('.');
}
sb.追加(ss[i]);
}
}否则如果(s.indexOf('.')!=-1){
字符串[]ss=s.split(\\);
如果(ss.length>2){
sb.附加(s.替换(“.”,”);
}否则{
//假设它是十进制分隔符
追加(ss[0])。追加('.')。追加(ss[1]);
}
}else if(s.indexOf(',')!=-1){
字符串[]ss=s.split(“,”);
如果(ss.length>2){
某人附加(s.替换(“,”,”);
}否则{
//假设它是十进制分隔符
追加(ss[0])。追加('.')。追加(ss[1]);
}
}
BigDecimal bd=新的BigDecimal(sb.toString());
返回bd;
}

我们的想法是首先检查我们是否都有小数部分,然后将所有
替换为
,然后跳过所有
,最后一个除外。否则,如果我们有几个相同的分隔符,它就是没有小数部分的数字。在另一种情况下,我们需要知道模式以区分是否使用十进制。对于样本数,我们假设它是十进制的

好的,但我真的不知道“n”字符串的格式。用例是:我有一个字符串数组,我必须转换。如果你没有模式,你就不能解析任何东西。如何在没有模式的情况下区分“1234.56”和“1.234,56”?如果你知道总是有2个小数,你可以选择小数分隔符来构建模式,我认为……你的代码打印1.234,因为
格式。解析
,这将遇到与以下问题相同的问题:与输入字符串不匹配的不精确值。对于字符串“s3”,打印1.234是,并且1.234是BigDecimal的有效输入,但我想要1234.56!对于“1234567”(无小数部分),结果将是错误的。。。(1234.567)但这是迄今为止最好的一次拍摄……你说得对@BenB。在不知道案例111222的模式的情况下区分它是1112222还是111.222是不真实的。
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);
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;
}