如何在Java中提取示例价格中的货币与数值属性?
问题
我正在获取不同货币表示的产品价格值,示例如下:
$ 1213.22 1213.22 $ R$ 1213,22
我希望将这些值存储到格式化的Java对象中,以便提取以下信息:
- 货币符号
- 整数与小数部分的分隔符
- 价格整数部分
- 价格小数部分
除了使用正则表达式外,是否有可用的工具来实现此功能?
已探索的解决方案:
- 我无法逆向改造以下方案,让
NumberFormat能够接收我获取到的值
java.util.Currency usd = java.util.Currency.getInstance("USD"); java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(Locale.US); format.setCurrency(usd);
- 与方案1存在相同问题
StringBuilder builder=new StringBuilder(); Formatter f=new Formatter(builder); f.format(Locale.FRANCE,"%.5f", -1325.789);
解决方案
Java标准库的NumberFormat仅支持对应Locale的正向格式化,逆向解析灵活性不足,无法适配货币符号位置不固定的场景。你可以使用ICU4J库来实现灵活的货币格式解析,它扩展了Java标准库的格式化能力,支持更多样的输入格式。
实现步骤
- 引入ICU4J依赖(以Maven为例):
<dependency> <groupId>com.ibm.icu</groupId> <artifactId>icu4j</artifactId> <version>73.2</version> </dependency>
- 使用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
相关产品推荐
相关产品推荐

