You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:06:25