You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中提取示例价格中的货币与数值属性?

问题

我正在获取不同货币表示的产品价格值,示例如下:

$ 1213.22
1213.22 $
R$ 1213,22

我希望将这些值存储到格式化的Java对象中,以便提取以下信息:

  • 货币符号
  • 整数与小数部分的分隔符
  • 价格整数部分
  • 价格小数部分

除了使用正则表达式外,是否有可用的工具来实现此功能?

已探索的解决方案:

  1. 我无法逆向改造以下方案,让NumberFormat能够接收我获取到的值
java.util.Currency usd = java.util.Currency.getInstance("USD");
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(Locale.US);
format.setCurrency(usd);
  1. 与方案1存在相同问题
StringBuilder builder=new StringBuilder();
Formatter f=new Formatter(builder);
f.format(Locale.FRANCE,"%.5f", -1325.789);
解决方案

Java标准库的NumberFormat仅支持对应Locale的正向格式化,逆向解析灵活性不足,无法适配货币符号位置不固定的场景。你可以使用ICU4J库来实现灵活的货币格式解析,它扩展了Java标准库的格式化能力,支持更多样的输入格式。

实现步骤

  1. 引入ICU4J依赖(以Maven为例):
<dependency>
    <groupId>com.ibm.icu</groupId>
    <artifactId>icu4j</artifactId>
    <version>73.2</version>
</dependency>
  1. 使用ICU4J的NumberFormat解析价格字符串,提取所需信息:
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.util.CurrencyAmount;
import com.ibm.icu.util.ULocale;
import java.text.ParseException;

public class CurrencyParser {
    public static void main(String[] args) throws ParseException {
        String[] priceInputs = {"$ 1213.22", "1213.22 $", "R$ 1213,22"};
        
        // 使用ROOT Locale的货币解析器,适配多格式输入
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(ULocale.ROOT);
        currencyFormat.setParseIntegerOnly(false);
        
        for (String price : priceInputs) {
            CurrencyAmount parsedAmount = (CurrencyAmount) currencyFormat.parse(price);
            
            // 提取货币符号
            String currencySymbol = parsedAmount.getCurrency().getSymbol();
            // 提取数值并拆分整数、小数部分
            double priceValue = parsedAmount.getNumber().doubleValue();
            long integerPart = (long) priceValue;
            int decimalPart = (int) Math.round((priceValue - integerPart) * 100);
            // 提取小数分隔符
            com.ibm.icu.text.DecimalFormat df = (com.ibm.icu.text.DecimalFormat) currencyFormat;
            String decimalSeparator = String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator());
            
            // 输出结果
            System.out.println("输入价格: " + price);
            System.out.println("货币符号: " + currencySymbol);
            System.out.println("小数分隔符: " + decimalSeparator);
            System.out.println("整数部分: " + integerPart);
            System.out.println("小数部分: " + decimalPart);
            System.out.println("---");
        }
    }
}

说明

  • ICU4J的NumberFormat支持货币符号在数值前后的多种格式解析,无需指定固定Locale;
  • 通过CurrencyAmount可以直接获取货币对象和数值,再拆分整数、小数部分;
  • 从DecimalFormatSymbols中可以提取到小数分隔符信息,满足你的需求。

如果不想引入第三方库,仅用Java标准库的话,确实很难覆盖所有非标准格式的输入,此时正则表达式会是更直接的选择,但ICU4J能大幅降低解析逻辑的复杂度。

内容的提问来源于stack exchange,提问作者Siddhant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:37:37