带组分隔符和十进制分隔符的数字转换为十进制数字

时间:2019-12-04 13:34:57

标签: java decimal bigdecimal

我想将数字"4,471.26"转换为十进制数字"4471.26"

实际上数字“ 4,471.26”是作为字符串接收的,为了进行进一步处理,需要将其转换为十进制数字。

"4,471.26"-只是一种格式,因此值始终在变化。该值可能类似于“ 654,654,25.54"

通过将逗号(,)作为组分隔符进行了尝试。但是看起来具有不同的ASCII值。

String Tempholder = "4,471.26";
Decimal.valueOf(Tempholder.replaceAll(getGroupSeparator(), ""));



  private char getGroupSeparator() {
            DecimalFormat decFormat = new DecimalFormat();
            DecimalFormatSymbols decSymbols = decFormat.getDecimalFormatSymbols();
            return Character.valueOf(decSymbols.getGroupingSeparator());
        }

下面的代码是临时解决方案,但不适用于其他地理区域。

String Tempholder = "4,471.26";
Decimal.valueOf(Tempholder.replaceAll(",", ""));

请帮助..

4 个答案:

答案 0 :(得分:0)

您可以这样:

public class JavaCodes{
public static void main(String[] args) {
    String str = new String("4,233.19");
    str = str.replaceFirst(",", "");
    System.out.println(Double.valueOf(str));
  }
}

答案 1 :(得分:0)

好的,首先要假设一些

  • 您事先不知道语言环境
  • 如果仅找到一个分隔符,并且仅出现一次,则将其视为十进制分隔符(为简单起见)
  • 如果仅找到一个分隔符,但它出现多次,则为数千个分隔符
  • 任何非数字字符都是有效的分隔符
  • 如果一个字符串中有两个以上的非数字字符,那就是错误。

这是算法

  • 找到第一个非数字字符并暂时将其视为小数点分隔符
  • 如果找到另一个非数字字符
    • 如果它与小数点分隔符相同,而我们仍然没有千位分隔符,请使该千位分隔符并重置小数点分隔符
    • 如果它与小数点分隔符相同,并且我们已经有一个千位分隔符,那就是一个错误
    • 如果它与小数点分隔符不同,则是千位分隔符
  • 从原始字符串中删除所有出现的千位分隔符(如果存在)
  • 用点代替小数点分隔符
  • 解析为两倍。

这是代码。

public class Test {

    public static double parseNumber(String x) {
        Character thousandsSeparator = null;
        Character decimalSeparator = null;

        for (int i = 0; i < x.length(); i++) {
            if (!Character.isDigit(x.charAt(i))) {
                if (decimalSeparator == null) {
                    decimalSeparator = x.charAt(i);
                } else {
                    if (decimalSeparator.equals(x.charAt(i))) {
                        if (thousandsSeparator == null) {
                            thousandsSeparator = x.charAt(i);
                            decimalSeparator = null;
                        } else {
                            if (!thousandsSeparator.equals(x.charAt(i))) {
                                throw new IllegalArgumentException();
                            }
                        }
                    } else {
                        thousandsSeparator = x.charAt(i);
                    }
                }
            }
        }

        // remove thousands separator
        if (thousandsSeparator != null) {
            int formerSeparatorPosition;
            while ((formerSeparatorPosition = x.indexOf(thousandsSeparator)) != -1) {
                x = x.substring(0, formerSeparatorPosition) + x.substring(formerSeparatorPosition + 1);
            }
        }

        // replace decimal separator with a dot
        if (decimalSeparator != null) {
            x = x.replace(decimalSeparator, '.');
        }
        return Double.parseDouble(x);

    }

    public static void main(String args[]) {
        System.out.println(parseNumber("123.45"));
        System.out.println(parseNumber("123,45"));
        System.out.println(parseNumber("1.234,5"));
        System.out.println(parseNumber("1,234.5"));
        System.out.println(parseNumber("1,234,567.512"));
        System.out.println(parseNumber("1.234.567,512"));
        ystem.out.println(parseNumber("1.234.567"));
        System.out.println(parseNumber("1_234_567|34")); // works with any two characters, if there are just two
        try {
            System.out.println(parseNumber("1_234_567|34,7")); // invalid
        } catch (IllegalArgumentException e) {
            System.out.println("Too many separators!");
        }
    }
}

答案 2 :(得分:0)

解析为BigDecimal是非常偶然的事情。对于double来说更容易 但是浮点数只是一个近似值,会降低数字的精度。 0.2 == 0.20 == 0.200 ==(实际上就像)0.1999999987。

    String text = "4,471.26";
    DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
    format.setParseBigDecimal(true);
    BigDecimal number = (BigDecimal) format.parseObject(text);
    // number.scale() == 2

美国语言环境使用所需的分隔符。

答案 3 :(得分:0)

谢谢大家的建议和帮助。我找出以下解决方案。将其转换为十进制数字,并适用于所有地理区域。

public static void geoSp() {
    String a = "4.233,19";
    NumberFormat as = NumberFormat.getInstance();
    double myNumber = 0;
    try {
        myNumber = as.parse(a).doubleValue();
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println(String.valueOf(myNumber));
}

   gives  Out put :- 4233.19