如何让 iOS 中的用户可以选择自己的货币
Posted
技术标签:
【中文标题】如何让 iOS 中的用户可以选择自己的货币【英文标题】:How to give users in iOS the choice to choose their own currency 【发布时间】:2018-08-10 03:07:24 【问题描述】:我有一个 ios 应用程序,它不断收到用户的反馈,他们希望能够设置自己的货币类型。现在我正在使用currencyFormatter.locale
获取用户本地货币并将其用于应用程序。我的想法是,我也许可以在应用程序的设置部分创建一个 tableView,让用户选择他们想要使用的货币。
我会在那里保存所需的货币,然后使用它而不是现在显示的语言环境。
要完成这项工作,我需要提取哪些数据?苹果会提供这些数据吗?我想我需要currency codes,但这会是正确的数据供用户选择吗?
我找到了这个repo,它看起来很有用,但似乎不再受支持/更新了。
我只需要一些帮助,指出正确的方向,因为我的研究没有取得任何进展。
Money
编辑
我发现了一个应用,我认为它的功能与我想要实现的类似。
【问题讨论】:
【参考方案1】:你是对的,你应该做一个列表屏幕,让用户从中选择他们想要的货币。保存该货币并使用它而不是语言环境。您可以使用此代码获取货币名称和货币符号的列表。
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)
编辑 2
与自定义模型相同的代码。
这就是您的自定义模型的外观。
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)
【讨论】:
我是否需要从字典中创建 2 个数组以用作 UITableView 中的数据源? 没有。 IMO 你应该创建一个自定义模型,比如CurrencyModel
。向此模型添加两个属性currencyName
和currencyCode
。然后你可以有一个CurrencyModel
类型的单一数据源数组。
如果你愿意,我可以把上面的代码改成CurrencyModel
。
那太好了,我想我在听你说的话,但最好检查一下。
非常感谢,真的帮了我大忙!我有一个关于如何清理货币数据的问题,但会在一个新问题中提出。【参考方案2】:
您应该改为设置格式化程序的currencySymbol
:
let currencyFormatter = NumberFormatter()
currencyFormatter.numberStyle = .currency
currencyFormatter.currencySymbol = "¥"
currencyFormatter.string(from: 123) // "¥123.00"
您可以为用户提供UITextField
,让他们输入任意字符串作为货币符号。
如果您希望用户从列表中选择区域设置并使用该区域设置的货币符号,也可以使用 Locale
实例的 currencySymbol
属性。
关于地区和货币的说明:
货币和语言环境没有一一对应的关系。一种货币可以在多种语言环境中使用,但一种语言环境通常有一种对应的货币,因为Locale
中有一个currencySymbol
。语言环境用于决定货币符号的位置。例如,在法国,货币符号将放在末尾。这意味着如果您只有一个货币符号,则在字符串中没有“正确”的位置,因为您没有指定语言环境。因此,如果您希望货币符号出现在用户的预期位置,请询问用户他们想要的语言环境,而不是货币符号。如果您不关心货币符号是否显示在用户的预期位置,则使用用户当前的语言环境显示它。
【讨论】:
如果我让用户输入任何符号,货币格式如何正确显示数字?具体在哪里放置货币符号。 正如我在上一段中所说,您可以让用户从语言环境列表中进行选择,并使用语言环境实例的currencySymbol
属性。 @icekomo
@icekomo 您可能还考虑到用户的区域设置可能与他们想要的货币不对应,因此为了实现最大程度的自定义,货币符号和区域设置应该是单独的选项。另请注意,您无法仅通过查看用户所需的货币来获取用户的语言环境。欧元在许多不同的地区使用。
所以想法是让他们选择他们想要使用的任何货币符号(这就是为什么我认为在表格视图或 UIPicker 中显示它们可能是最好的,然后将其用作格式。这个对我来说是全新的,所以我正在努力解决这个问题。我解决这个问题的方法有效吗?@sweeper
@icekomo 查看编辑。如果您不要求语言环境,则无法在用户期望的地方获得货币。您始终可以使用用户当前的语言环境,这是我的第一个代码 sn-p 所做的。以上是关于如何让 iOS 中的用户可以选择自己的货币的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 3.1 MVC 如何让用户在注册时选择自己的角色?