Java NumberFormat无法解析货币为';中国的国际象征

Java NumberFormat无法解析货币为';中国的国际象征,java,locale,currency,Java,Locale,Currency,我需要用货币的国际符号而不是货币的符号来解析金额,然后提取金额。 也就是说,我需要解析14.00USD而不是*$**14.00*或*14.00**CAD*而不是***$**14.00* 为此,我放置了以下代码,例如: NumberFormat.getCurrencyInstance(Locale.forLanguageTag(“en-CA”)).parse(“14.00 CAD”).doubleValue(); 上述代码段引发异常java.text.ParseException:Unparse



我需要用货币的国际符号而不是货币的符号来解析金额,然后提取金额。
也就是说,我需要解析14.00USD而不是*$**14.00*或*14.00**CAD*而不是***$**14.00*
为此,我放置了以下代码,例如:

NumberFormat.getCurrencyInstance(Locale.forLanguageTag(“en-CA”)).parse(“14.00 CAD”).doubleValue();
上述代码段引发异常
java.text.ParseException:Unparseable number
,因为通过getCurrencyInstance()获取的十进制格式要求货币字符串以$$-开头 我发现很难相信NumberFormat不能处理合法的货币字符串,如14.00加元;更有可能的是,我没有找到正确使用它的方法。


那么,如何解析带有货币国际符号(如14.00 CAD)的金额呢?

我相信您只想从字符串中得到金额

您可以通过以下方式实现:

public class Main {
    public static void main(final String[] args) {
        String strAmount="14.00 CAD".replaceAll("[^\\d.]+", "");
        double amount=Double.parseDouble(strAmount);
        System.out.println(amount);

        strAmount="14.00 USD".replaceAll("[^\\d.]+", "");
        amount=Double.parseDouble(strAmount);
        System.out.println(amount);

        strAmount="$14.00".replaceAll("[^\\d.]+", "");
        amount=Double.parseDouble(strAmount);
        System.out.println(amount);
    }
}
输出:

14.0
14.0
14.0

我相信你想从字符串中得到的只是数量

您可以通过以下方式实现:

public class Main {
    public static void main(final String[] args) {
        String strAmount="14.00 CAD".replaceAll("[^\\d.]+", "");
        double amount=Double.parseDouble(strAmount);
        System.out.println(amount);

        strAmount="14.00 USD".replaceAll("[^\\d.]+", "");
        amount=Double.parseDouble(strAmount);
        System.out.println(amount);

        strAmount="$14.00".replaceAll("[^\\d.]+", "");
        amount=Double.parseDouble(strAmount);
        System.out.println(amount);
    }
}
输出:

14.0
14.0
14.0

您需要使用RegExIt,这似乎是可能的。调用NumberFormat.getCurrencyInstance()然后接近;它将数字格式化为,例如,
CA$14.00
。请注意,在解析时,使用
NumberFormat.getInstance
而不是getCurrencyInstance将忽略数值后的字符。您需要使用RegExIt,这似乎是可能的。调用NumberFormat.getCurrencyInstance()然后接近;它将数字格式化为,例如,
CA$14.00
。请注意,在解析时,使用
NumberFormat.getInstance
而不是getCurrencyInstance将忽略数值后面的字符。我认为它不会保留小数。试试14.56卡我的坏。我没有。感谢您的确认。@ArvindKumarAvinash本地化的数量有不同的形式:在美国是14.99,在巴西是14,99。。。那么1000000.99呢?或者用其他形式记下你我都不知道的金额?RegEx只是一个补丁,而用Locale配置的NumberFormat应该是真正的解决方案。@Lev-我错过了你的评论。在寻找其他内容时,我刚好看到了这一页。我不确定这个解决方案是否适合您,或者您是否实施了不同的解决方案。如果您实现了不同的解决方案,那么共享相同的解决方案将非常有用。无论哪种情况,你都可以通过接受对你有用的答案来帮助社区。一个被接受的答案有助于未来的访问者自信地使用解决方案。@ArvindKumarAvinash我最终得到了如下难看的代码:
NumberFormat priceFormat=NumberFormat.getInstance(Locale.forLanguageTag(Locale));DecimalFormatSymbols formatSymbols=((DecimalFormat)priceFormat).getDecimalFormatSymbols();字符串regexAnyCurrencySymbol=“[^\\d”+formatSymbols.getMonetaryDecimalSeparator()+formatSymbols.getGroupingSeparator()+”];parse(price.replaceAll(regexAnyCurrencySymbol,“”).doubleValue()我认为它不保留小数。试试14.56卡我的坏。我没有。感谢您的确认。@ArvindKumarAvinash本地化的数量有不同的形式:在美国是14.99,在巴西是14,99。。。那么1000000.99呢?或者用其他形式记下你我都不知道的金额?RegEx只是一个补丁,而用Locale配置的NumberFormat应该是真正的解决方案。@Lev-我错过了你的评论。在寻找其他内容时,我刚好看到了这一页。我不确定这个解决方案是否适合您,或者您是否实施了不同的解决方案。如果您实现了不同的解决方案,那么共享相同的解决方案将非常有用。无论哪种情况,你都可以通过接受对你有用的答案来帮助社区。一个被接受的答案有助于未来的访问者自信地使用解决方案。@ArvindKumarAvinash我最终得到了如下难看的代码:
NumberFormat priceFormat=NumberFormat.getInstance(Locale.forLanguageTag(Locale));DecimalFormatSymbols formatSymbols=((DecimalFormat)priceFormat).getDecimalFormatSymbols();字符串regexAnyCurrencySymbol=“[^\\d”+formatSymbols.getMonetaryDecimalSeparator()+formatSymbols.getGroupingSeparator()+”];parse(price.replaceAll(regexAnyCurrencySymbol,“”).doubleValue()