【问题标题】:Get double value from currency frormatted string从货币格式化字符串中获取双倍值
【发布时间】:2018-08-30 20:03:52
【问题描述】:

我在我的应用程序中使用NumberFormat 来获取货币格式的字符串。就像用户在字段中输入 12.25 一样,它将根据区域设置更改为 $12.25。这里的语言环境是 en-US。 现在我想将 12.25 值作为格式化字符串的双精度值。 为此,我使用过:

NumberFormat.getCurrencyInstance().parse("$12.25").doubleValue();

上面的行给了我 12.25 的结果,这是我的要求。但是假设用户将他的语言环境更改为其他en-UK。现在对于那个语言环境,上面的语句给了我 parseException。因为对于语言环境 en-UK,货币字符串 $12.25 是不可解析的。

那么有什么方法可以从货币格式的字符串中获取双精度值,而不管语言环境是什么?

【问题讨论】:

  • 您可以拆分第一个字符(区域货币符号)。 idk,如果它是你想要的。
  • 希望每个用户在您的商店支付相同的价格,具体取决于区域设置。 12.25 欧元超过 12.25 美元 ^^
  • 首先我猜你不应该只为一个语言环境硬编码......然后,对于你在源代码中编码的任何语言环境,开关盒可以帮助你做你想做的事......
  • @AntonioI 可以拆分第一个字符。但问题在于Brazilian Portuguese 的货币符号是R$,而comma(,) 用作小数分隔符。
  • 您想在网页中保留状态吗?这不是一个好主意。

标签: java android number-formatting currency-formatting


【解决方案1】:

这里有一个小算法可以帮助你:

public static void main(String[] args)  {

        String cash = "R$1,000.75"; //The loop below will work for ANY currency as long as it does not start with a digit
        boolean continueLoop = true;

                char[] cashArray = cash.toCharArray();      

        int cpt = 0;

                while(continueLoop){
                    try  
                    {  
                        double d = Double.parseDouble(cashArray[cpt]+"");  
                        continueLoop = false;
                    }catch(NumberFormatException nfe){  
                        cpt += 1;  
                    }
                }

                System.out.println(cpt);

                //From here you can do whatever you want....

                String extracted = cash.substring(cpt);

                NumberFormat format = NumberFormat.getInstance(Locale.US); //YOUR REQUIREMENTS !!!! lol
                try {
                    Number youValue = format.parse(extracted);
                    System.out.println(youValue.doubleValue());
                } catch (ParseException ex) {
                    //handle your parse error here
                }

    }

你应该在输出中得到结果:

2

1000.75

【讨论】:

    【解决方案2】:

    我不知道以下解决方案是否完美,但它可以根据我的要求工作。

    try {
        return NumberFormat.getCurrencyInstance().parse(currency).doubleValue();
    } catch (ParseException e) {
        e.printStackTrace();
        // Currency string is not parsable
        // might be different locale
        String cleanString = currency.replaceAll("\\D", "");
        try {
            double money = Double.parseDouble(cleanString);
            return money / 100;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    return 0;
    

    【讨论】:

      【解决方案3】:

      怎么样

      new Double(NumberFormat.getCurrencyInstance().parse("$12.25").doubleValue());
      

      你也可以使用

      Double.valueOf() 创建一个 Double 对象,因此 .doubleValue() 不是必需的。

      还有Double.parseDouble(NumberFormat.getCurrencyInstance().parse("$12.25"));

      可以工作

      【讨论】:

      • 感谢您的回复。但是我的问题是,如果用户区域设置和货币格式的字符串区域设置不匹配,则解析不起作用。所以我需要一个解决方案。
      • 您可以只为带有货币的区域设置一个字符串并将其附加到值
      • @DeepakGoyal 是的...您不能只对 en-US Locale 进行硬编码并期望它与 en-UK Locale 一起使用
      • @JasonKrs 没错,这是我的要求。
      • @DeepakGoyal 我想从编程上讲,你必须根据你的要求调整你的代码......如果你的程序要使用 5 种不同的语言环境,那么我建议你不要使用 SWITCH CASE它;-)
      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多