如何使用 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.text.NumberFormat 解析日本货币字符串