【发布时间】: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到格式化字符串的转换。同样,不要使用格式化字符串进行计算,它只是为了方便用户的视觉表示。