如何获取可用的国家和货币?

Posted

技术标签:

【中文标题】如何获取可用的国家和货币?【英文标题】:How to get available countries and Currencies? 【发布时间】:2016-05-03 13:15:10 【问题描述】:

我尝试同时获取所有可用国家和货币的列表。 我希望国家名称出现在微调器上,当用户选择国家时,它会返回货币符号。 我的方法有效,但我认为这是非常糟糕的做法,因为加载数据需要 3-2 秒。 我是这样做的:

  public ArrayList<CurrencyModel> getCountriesAndCurrency()
        ArrayList<CurrencyModel> result = new ArrayList<>();
        ArrayList<Locale> list = new ArrayList<>(Arrays.asList(Locale.getAvailableLocales()));
        for (int i = 0; i <list.size(); i++) 
            String country = list.get(i).getDisplayCountry();
            try 
                Locale pickedLocal = new Locale(list.get(i).getISO3Language(), list.get(i).getCountry());
                String code = Currency.getInstance(pickedLocal).getCurrencyCode();
                Currency currency = Currency.getInstance(code);
                String currencySymbol = currency.getSymbol(pickedLocal);
                if(currencySymbol.length()>1)
                    currencySymbol = currency.getSymbol();
                
                result.add(new CurrencyModel(list.get(i), country, currencySymbol));
             catch (Exception e) 
            
        
        Collections.sort(result, new CustomComparator());
        ArrayList<CurrencyModel> finalRes = new ArrayList<>();
        for (int i = 0; i < result.size(); i++) 
            try 
                if(!result.get(i).getCountryName().equals(result.get((i+1)).getCountryName())) 
                    finalRes.add(result.get(i));
                
            catch (Exception e)
        
        Collections.sort(finalRes, new CustomComparator());
        return finalRes;
    

    public class CustomComparator implements Comparator<CurrencyModel> 
        @Override
        public int compare(CurrencyModel o1, CurrencyModel o2) 
            return o1.getCountryName().compareTo(o2.getCountryName());
        
    

CurrencyModel 对象是 = locale locale ,String countryName , String currencySymbol。

此操作有更好的解决方案吗?

【问题讨论】:

一开始获取的时候可以保存/缓存到sharedPreferences,如果时间太长的话。 我已经用更多增强功能更新了答案(假设),如果您有任何增强功能,请检查并发布结果 【参考方案1】:

发现几件事可以帮助你 不确定它们是否会显着提高结果

1- 语言环境重新实例化 Locale pickedLocal = new Locale(list.get(i).getISO3Language(), list.get(i).getCountry()); 为什么要使用 locale 属性重新创建 locale ? 你只需要分配它:

Locale pickedLocal = list.get(i);

2- 货币相同,

String code = Currency.getInstance(pickedLocal).getCurrencyCode();
Currency currency = Currency.getInstance(code);
String currencySymbol = currency.getSymbol(pickedLocal);

据我了解,您的目标是获得currencySymbol,所以就这样做吧:

String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();

所以最后的代码块(带有 try-catch 的那个)应该是这样的

try 
    Locale pickedLocal = list.get(i);
    String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();
    if(currencySymbol.length()>1)
        currencySymbol = currency.getSymbol();
    
    result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
 catch (Exception e) 

result.add(new CurrencyModel(list.get(i),... 使用pickLocal,不要从列表中重新获取项目。

这就是我到目前为止所得到的,我会将任何进一步的发现附加到这个答案中。

编辑:(也许您必须先对邮件“列表”进行排序) 再次查看代码,我发现您在填充结果列表后尝试删除重复项,如果您在添加新项目之前检查结果列表,您将摆脱第二个循环

try 
    Locale pickedLocal = list.get(i);
    String currencySymbol = Currency.getInstance(pickedLocal).getSymbol();
    if(currencySymbol.length()>1)
        currencySymbol = currency.getSymbol();
    

    //TO AVOID the second loop (check duplicates), add only if not exist
    final int size = result.size();
    if(size > 0)
        if(!result.get(size-1).getCountryName().equals(country))
            //no similar item was added yet, so add the new item
            result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
        
    else
        //it still empty, just add the new item
        result.add(new CurrencyModel(pickedLocal, country, currencySymbol));
    
 catch (Exception e) 

【讨论】:

谢谢 .. 但我只是使用 asyncTask 并且它工作得更快

以上是关于如何获取可用的国家和货币?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows Phone 8.1 中获取当前位置的当前货币代码

数字货币新机遇,民众如何获取央行数字货币?

如何从 iphone sdk 中的 ISOCountryCode 获取 ISOCurrencyCode?

如何获得 Magento 商店货币

根据国家/地区获取货币符号

Tweepy-Twitter Python:获取没有可用 WOEID 的趋势