【问题标题】: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 转换为 DoubleNSNumber。将 Double/NSNumber 发送到您的服务器。当您向用户展示它们时,仅应用从 Double/NSNumber 到格式化字符串的转换。同样,不要使用格式化字符串进行计算,它只是为了方便用户的视觉表示。

标签: ios swift


【解决方案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

【讨论】:

  • 请注意,我对我的答案进行了多次修改,但我相信我终于找到了您正在寻找的确切答案。
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 2019-01-20
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多