如何使用 NumberFormat 类在 java 中解析“1,23$”并获得 123 作为数字

Posted

技术标签:

【中文标题】如何使用 NumberFormat 类在 java 中解析“1,23$”并获得 123 作为数字【英文标题】:How to parse "1,23$" in java using NumberFormat class and obtain 123 as number 【发布时间】:2019-11-22 04:45:59 【问题描述】:

我尝试了以下代码示例,但没有奏效,

NumberFormat.getCurrencyInstance(Locale.US).parse("1,23$")

抛出异常

java.text.ParseException: Unparseable number: "1,23$"

【问题讨论】:

您可以尝试手动遍历字符串并进行解析。 可以使用正则表达式去掉$,.等,然后解析 我需要一个一致的 api,尤其是使用可以解析 "$1,23" 和 "1,23$" 的 NumberFormat,我不希望手动解析字符串 @Muhammad,是的,我知道这些基本的东西,但我只打算通过 NumberFormat 类来做到这一点 如果你只对数字感兴趣,为什么需要使用numberformat? 【参考方案1】:
    DecimalFormat df = new DecimalFormat();
    DecimalFormatSymbols dfs = new DecimalFormatSymbols();
    dfs.setCurrencySymbol("$");
    dfs.setGroupingSeparator('.');
    dfs.setDecimalSeparator(',');
    df.setDecimalFormatSymbols(dfs);       
    final Number parse = df.parse("1,23$");
    System.out.println(parse);

【讨论】:

输入有逗号,不是小数 你说得对,我想这行得通。我调整了这个解决方案:***.com/questions/10536899/…【参考方案2】:

您不能使用一种数字格式同时检查两者。如果另一个失败,您需要尝试一个:

DecimalFormat format1 = 
    (DecimalFormat)NumberFormat.getNumberInstance(Locale.US);
format1.applyPattern("##,#0¤");

DecimalFormat format2 = 
    (DecimalFormat)NumberFormat.getNumberInstance(Locale.US);
format2.applyPattern("¤##,#0");

System.out.println(format1.parse("1,23$"));
System.out.println(format2.parse("$1,23"));

这使用货币模式占位符¤

【讨论】:

这是最接近我要求的答案之一,我可以设法在运行时获取模式,感谢您的帮助,【参考方案3】:

好像你想要这个

public int getValue(String s) 
    return Integer.parseInt(s.replaceAll("\\pPunct", ""));
 

【讨论】:

当然,事实上我已经尝试过了,但是有没有办法使用 NumberFormat 或任何支持解析“1,23$”和“$1”的第三方库来做到这一点, 23" 我不确定我是否理解这些要求。 Integer 是 Number 子类,为什么重要的是你如何得到它? 好的,如果这就是全部,那么在 jdk 中添加 NumberFormat.getCurrencyInstance 有什么意义呢?使用这个 api 有一些目的,因此我想使用这个 CurrencyInstance 来解析任何给定的金额,例如“1,23€”,“€2,34”,“$3,2”,“5.6$”使用一个通用的 api,这就是为什么我正在寻找使用 NumberFormat.getCurrencyInstance(..) 类似的东西,:) 当您真正需要解析货币时使用它,而不仅仅是获取字符串中的所有数值。解决简单问题的方法不止一种【参考方案4】:

重新格式化你的字符串。

String s = "1,23$";
s = '$' + s.replaceAll("\\pPunct", "");
System.out.println(NumberFormat.getCurrencyInstance(Locale.US).parse(s));

【讨论】:

为什么要使用货币解析?您已删除美元和逗号,因此只需解析为 int【参考方案5】:
Number number = NumberFormat.getCurrencyInstance(Locale.US).parse("$1,23");

        System.out.println("Number is "+ number ) ;

输出是

Number is 123

如果你传递值1,23$

Exception in thread "main" java.text.ParseException: Unparseable number: "1,23$"
    at java.text.NumberFormat.parse(NumberFormat.java:385)
    at com.example.polls.PollsApplicationTests.main(PollsApplicationTests.java:18)

【讨论】:

我的输入是:“1,23$”,但是解析函数应该适用于“$1,23”和“1,23$” @Manoranjan 不,你必须再次了解解析函数 我的数据中存在货币符号的金额数据,例如:“1,23€”、“€2,34”、“$3,2”、“5.6$”,其中货币符号只能在结尾或开头,我需要使用 NumberFormat 使用相同的代码解析所有这些货币数据,如果不是 NumberFormat,第 3 方库对我来说可以正常工作 然后删除所有货币符号并解析纯文本 是的,我已经尝试删除所有货币符号并且它确实有效,但我的疑问是:但是在 JDK 中有 NumberFormat.getCurrencyInstance(..) 有什么意义

以上是关于如何使用 NumberFormat 类在 java 中解析“1,23$”并获得 123 作为数字的主要内容,如果未能解决你的问题,请参考以下文章

Java 如何将 groupingSize() 与 NumberFormat 一起使用

如何在 Java/Kotlin 中获取 NumberFormat 的语言环境?

Java中的右对齐字符串NumberFormat

使用 java.text.NumberFormat 解析日本货币字符串

Java 详解数字格式化(NumberFormat&DecimalFormat)

Numberformat.parse 在java中的法语语言环境中无法正常工作