Java - 如何使用货币格式将字符串转换为大十进制

Posted

技术标签:

【中文标题】Java - 如何使用货币格式将字符串转换为大十进制【英文标题】:Java - How to convert string to big decimal with money format 【发布时间】:2019-02-12 20:46:43 【问题描述】:

我的字符串是“1234567”,我想得到两个像这样的大十进制对象 12345,67 和 12.345,67 但我做不到。代码如下:

DecimalFormat decimalFormat = new DecimalFormat("#,##0.###");
decimalFormat.setParseBigDecimal(true);
String n = decimalFormat.format(1234567);
BigDecimal bigDecimal = (BigDecimal)decimalFormat.parse(n);

DecimalFormat decimalFormat1 = new DecimalFormat("#,0#");
decimalFormat1.setParseBigDecimal(true);
String n1 = decimalFormat.format(1234567);
BigDecimal bigDecimal1 = (BigDecimal)decimalFormat.parse(n1);

System.out.println(n);
System.out.println(bigDecimal);
System.out.println(n1);
System.out.println(bigDecimal1);

输出:

1.234.567,00 1234567.00 1.234.567,00 1234567.00

预期输出:

12.345,67 12.345,67 12345,67 12345,67

感谢您的帮助

【问题讨论】:

看起来您的输出和代码不匹配。确保您上传了最新的代码/结果。当我运行你的代码时,我在 "new DecimalFormat("#,0#")" 处得到格式错误的模式 "#,0#" 该代码根本不为我运行,它在运行时抛出此异常:java.lang.IllegalArgumentException: Malformed pattern "#,0#" 【参考方案1】:

数字格式总是特定于区域设置。因此需要定义的语言环境。 以下方法适用于格式化:

    BigDecimal money = new BigDecimal("1234567");

    DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.GERMAN);
    symbols.setDecimalSeparator(',');
    symbols.setGroupingSeparator('.');

    // https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html
    DecimalFormat format = new DecimalFormat("###,###.00");
    format.setDecimalFormatSymbols(symbols);

    System.out.println(format.format(money));

但是,这不满足将任何给定数字解析为 2 位小数的要求。在这里,我个人会应用除以 100,或者在给定的字符串中插入小数分隔符。

    BigDecimal money = new BigDecimal("1234567").divide(new BigDecimal("100"));

插入定义的小数分隔符可以像这样工作:

    private static String prepare(String input) 
        if (input.length() == 2) 
            return ","+input;
         
        if (input.length() == 1) 
            return ",0"+input;
        
        String integerPart = input.substring(0, input.length()-2);
        String fraction = input.substring(input.length()-2);
        return integerPart+","+fraction;
    

使用新的 DecimalFormat 和 prepare() 方法,它可以将字符串解析为默认具有 2 个小数的数字。

    String input = "1234567";
    String prepared = prepare(input);

    DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.GERMAN);
    symbols.setDecimalSeparator(',');
    symbols.setGroupingSeparator('.');

    DecimalFormat format = new DecimalFormat("###,###.00");
    format.setDecimalFormatSymbols(symbols);
    format.setParseBigDecimal(true);

    BigDecimal bigDecimal = (BigDecimal)format.parse(prepared);
    String n = format.format(bigDecimal);

    System.out.println(n);

【讨论】:

非常感谢。当我使用 System.out.println(bigDecimal) 打印时,它显示 12345.67 但 n 是 12.345,67

以上是关于Java - 如何使用货币格式将字符串转换为大十进制的主要内容,如果未能解决你的问题,请参考以下文章

将货币字符串转换为十进制?

通过jquery将货币转换为小数

如何将十进制属性格式化为货币?

货币的十进制格式

格式化字符串:标准数字格式

Pyspark 字符串到十进制转换以及精度和格式,如 Java 十进制格式化程序