将数字字符串转换为不同的区域格式
Posted
技术标签:
【中文标题】将数字字符串转换为不同的区域格式【英文标题】:Convert Number String to a Different Region Format 【发布时间】:2018-11-05 02:06:13 【问题描述】:我目前有一个文本字段,它需要一定数量的货币,并且用户在文本字段中输入的任何内容 (I.E 500.00) 都会在之前发送到服务器进行验证。
问题在于,当用户将他们的 iPhone 区域设置为像法国这样的数字格式为 4 567,89 而不是 4,567.89 时,后端的验证会产生误解,并且会认为提供的数字与实际数字不同是。
因此我有一个格式为 4 567,89 的字符串,我想将其转换为格式 4,567.89 或 4567.89
我尝试使用具有给定语言环境的 NumberFormatter,但它无法将 4 567,89 识别为数字并失败。
这是我尝试过的:
extension String
func toEnglishNumberFormat() -> String?
let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = false
currencyFormatter.numberStyle = NumberFormatter.Style.decimal
currencyFormatter.locale = Locale(identifier: "en_US_POSIX")
if let amount = currencyFormatter.number(from: self)
return "\(amount)"
else
return nil
除非这会失败,因为 currencyFormatter.number(from: self) 无法从看起来像“4 567,89”或类似的字符串创建数字。
关于如何处理在不同区域格式化的数字以使其不会失败验证的任何想法?谢谢。
【问题讨论】:
您似乎正在尝试操纵 formatted 字符串进行计算。不要那样做!当用户完成输入并且您从文本字段中读取值时,使用String
转换为 Double
或 NSNumber
。将 Double
/NSNumber
发送到您的服务器。当您向用户展示它们时,仅应用从 Double
/NSNumber
到格式化字符串的转换。同样,不要使用格式化字符串进行计算,它只是为了方便用户的视觉表示。
【参考方案1】:
我认为您应该将他们设备上当前任何语言环境的 string 转换为 NSNumber。然后将 NSNumber 转换为 en_US 格式的数字 string,因为这是您的 Web 服务所期望的。
extension String
func toEnglishNumberFormat() -> String?
let numFormatter = NumberFormatter() // defaults to current locale
numFormatter.numberStyle = NumberFormatter.Style.currency
numFormatter.isLenient = true // will permit the spaces as separators
guard let num = numFormatter.number(from: self) else
return nil
numFormatter.locale = Locale(identifier: "en_US_POSIX")
numFormatter.numberStyle = NumberFormatter.Style.decimal
let resultStr = numFormatter.string(from: num)
return resultStr
我在模拟器处于法语区域时对此进行了测试:
let str = "4 567,89"
let engStr = str.toEnglishNumberFormat()
print(engStr ?? "nil")
打印:4567.89
【讨论】:
请注意,我对我的答案进行了多次修改,但我相信我终于找到了您正在寻找的确切答案。以上是关于将数字字符串转换为不同的区域格式的主要内容,如果未能解决你的问题,请参考以下文章