Flutter跨平台应用:如何通过国家正确获取货币代码?
通过指定国家获取对应货币代码的Flutter实现方案
方案一:直接维护国家-货币代码映射表(推荐)
这种方法完全避开intl包对Locale的解析问题,直接通过国家代码(ISO 3166-1 alpha-2格式,如"US"、"FR")获取对应货币代码(ISO 4217格式),简单可靠,不会出现混合Locale导致的错误。
// 国家代码到货币代码的映射表(可根据业务需求扩展覆盖更多国家) final Map<String, String> countryToCurrency = { 'US': 'USD', 'FR': 'EUR', 'CN': 'CNY', 'JP': 'JPY', 'DE': 'EUR', 'GB': 'GBP', 'AU': 'AUD', }; /// 根据国家代码获取对应货币代码 String getCurrencyCode(String countryCode) { // 统一转为大写避免大小写问题 final upperCaseCode = countryCode.toUpperCase(); // 返回对应货币代码,无匹配时返回默认值(可自定义) return countryToCurrency[upperCaseCode] ?? 'USD'; }
方案二:构建指定国家的有效Locale后获取货币代码
如果需要和intl包的其他国际化功能结合,可以先获取目标国家的官方/主流语言代码,构建规范的Locale,再通过NumberFormat获取货币代码,避免混合Locale的错误。
import 'package:intl/intl.dart'; // 国家代码到对应主流语言代码的映射 final Map<String, String> countryToPrimaryLanguage = { 'US': 'en', 'FR': 'fr', 'CN': 'zh', 'JP': 'ja', 'DE': 'de', 'GB': 'en', }; /// 通过有效Locale获取指定国家的货币代码 String getCurrencyCodeByValidLocale(String countryCode) { final upperCaseCode = countryCode.toUpperCase(); final languageCode = countryToPrimaryLanguage[upperCaseCode]; if (languageCode == null) { return 'USD'; // 无匹配时返回默认值 } // 构建规范的Locale(语言+对应国家) final validLocale = Locale(languageCode, upperCaseCode); final numberFormat = NumberFormat.simpleCurrency(locale: validLocale.toString()); return numberFormat.currencyCode; }
关键说明
- 方案一无需依赖
intl,完全避免Locale解析错误,适合对可靠性要求高的场景; - 方案二解决了你提到的混合Locale问题(如
fr_US这类无效组合),通过使用国家的主流语言构建Locale,确保intl能正确识别国家并返回对应货币; - 两种方案中的映射表都可以根据业务覆盖的国家进行扩展,可参考ISO 3166(国家代码)和ISO 4217(货币代码)标准完善。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

