如何根据用户所在国家显示不同的价格数值与货币类型
解决方案
1. 定义静态汇率与货币配置
先创建一个枚举来管理支持的货币类型、静态汇率和对应符号:
enum TargetCurrency: String { case usd = "USD" case gbp = "GBP" case eur = "EUR" // 静态汇率:1欧元兑换对应货币的数值 var exchangeRateFromEUR: Double { switch self { case .eur: return 1.0 case .usd: return 1.09 case .gbp: return 0.86 } } var symbol: String { switch self { case .eur: return "€" case .usd: return "$" case .gbp: return "£" } } }
2. 获取用户区域对应的目标货币
通过系统Locale判断用户所在地区的货币类型:
func getUserTargetCurrency() -> TargetCurrency { let locale = Locale.current guard let currencyCode = locale.currencyCode else { return .eur // 无法获取时默认显示欧元 } switch currencyCode { case TargetCurrency.usd.rawValue: return .usd case TargetCurrency.gbp.rawValue: return .gbp default: return .eur } }
3. 修改视图实现价格转换与格式化
更新原有的ItemRow视图(注意遵循Swift大驼峰命名规范),加入转换和格式化逻辑:
struct ItemRow: View { let items: [Item] = Bundle.main.decode("item.json") private let targetCurrency = getUserTargetCurrency() // 欧元转目标货币 private func convertPrice(eurPrice: Double) -> Double { eurPrice * targetCurrency.exchangeRateFromEUR } // 格式化价格字符串 private func formatPrice(_ price: Double) -> String { let formattedNum = String(format: "%.2f", price) return "\(formattedNum)\(targetCurrency.symbol)" } var body: some View { List { ForEach(items) { item in HStack { Text(item.name) Spacer() // 让价格右对齐,优化布局 Text(formatPrice(convertPrice(eurPrice: item.price))) } } } } }
额外优化说明
- 遵循Swift命名规范,将原
itemRow改为ItemRow - 添加
Spacer()让价格在列表项右侧显示,布局更清晰 - 保留欧元作为 fallback,避免无法获取用户区域时出错
内容的提问来源于stack exchange,提问作者NicoCampa
相关产品推荐
相关产品推荐

