我有一个iOS应用程序,不断收到用户的反馈,他们希望能够设置自己的货币类型。现在我正在使用currencyFormatter.locale
来获取用户本地货币并将其用于应用程序。我的想法是,我可以在应用程序的设置部分创建一个tableView,让用户选择他们想要使用的货币。
我会保存所需的货币,然后使用它而不是现在显示的区域设置。
为了使这项工作,我需要提取哪些数据?这些数据会由Apple提供吗?我想我需要currency codes,但这是显示正确的数据供用户选择吗?
我发现这个repo,似乎这是有用的东西,但它似乎不再支持/更新。
我只是需要一些帮助指出正确的方向,因为我的研究没有取得任何进展。
编辑
我发现一个应用程序,我认为它正在做类似于我想要实现的东西。
你是对的,你应该制作一个列表屏幕,让用户从中选择所需的货币。保存该货币并使用它而不是区域设置。您可以使用此代码获取货币名称和货币符号列表。
NSLocale *locale = [NSLocale currentLocale];
NSArray *currencyCodesArray = [NSLocale ISOCurrencyCodes];
NSMutableDictionary *currenciesDict = [NSMutableDictionary new];
for (NSString *currencyCode in currencyCodesArray) {
NSString *currencyName = [locale displayNameForKey:NSLocaleCurrencyCode value:currencyCode];
NSString *currencySymbol = [locale displayNameForKey:NSLocaleCurrencySymbol value:currencyCode];
if (currencyName != nil && currencySymbol != nil) {
[currenciesDict setValue:currencySymbol forKey:currencyName];
}
}
return currenciesDict;
这是swift中的相同代码。
let locale = NSLocale.current as NSLocale
let currencyCodesArray = NSLocale.isoCurrencyCodes
var currenciesDict = [String: String]()
for currencyCode in currencyCodesArray {
let currencyName = locale.displayName(forKey: NSLocale.Key.currencyCode, value : currencyCode)
let currencySymbol = locale.displayName(forKey: NSLocale.Key.currencySymbol, value : currencyCode)
if let currencySymbol = currencySymbol, let currencyName = currencyName {
currenciesDict[currencySymbol] = currencyName
}
}
print(currenciesDict)
与自定义模型相同的代码。
这就是您的自定义模型的样子。
class CurrencyModel {
var currencyName = ""
var currencyCode = ""
}
这就是代码的样子。
let locale = NSLocale.current as NSLocale
let currencyCodesArray = NSLocale.isoCurrencyCodes
var currencies = [CurrencyModel]()
for currencyCode in currencyCodesArray {
let currencyName = locale.displayName(forKey:
NSLocale.Key.currencyCode, value : currencyCode)
let currencySymbol = locale.displayName(forKey:NSLocale.Key.currencySymbol, value : currencyCode)
if let currencySymbol = currencySymbol, let currencyName = currencyName {
let currencyModel = CurrencyModel()
currencyModel.currencyName = currencyName
currencyModel.currencyCode = currencyCode
currencies.append(currencyModel)
}
}
print(currencies)
您应该设置格式化程序的currencySymbol
:
let currencyFormatter = NumberFormatter()
currencyFormatter.numberStyle = .currency
currencyFormatter.currencySymbol = "¥"
currencyFormatter.string(from: 123) // "¥123.00"
您可以为用户提供UITextField
,让他们输入任意字符串作为货币符号。
如果您希望用户从列表中选择区域设置并使用该区域设置的货币符号,则还可以使用currencySymbol
实例的Locale
属性。
澄清当地和货币:
货币和区域设置没有一对一的对应关系。一种货币可用于多种语言环境,但一种语言环境通常有一种相应的货币,因为currencySymbol
中有Locale
。并且locale用于确定货币符号的位置。例如,在法国,货币符号将放在最后。这意味着如果您只有货币符号,则字符串中没有“正确”的位置,因为您尚未指定区域设置。因此,如果您希望货币符号位于用户的预期位置,请询问用户所需的区域设置,而不是货币符号。如果您不关心货币符号是否显示在用户的预期位置,则使用用户的当前区域设置显示它。