将数字字符串转换为不同的区域格式

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 转换为 DoubleNSNumber。将 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

【讨论】:

请注意,我对我的答案进行了多次修改,但我相信我终于找到了您正在寻找的确切答案。

以上是关于将数字字符串转换为不同的区域格式的主要内容,如果未能解决你的问题,请参考以下文章

关于在delphi中时间日期的转换问题,高手进

python怎么把字符串变成数字格式化

如何将 Luxon DateTime 格式转换为字符串或数字?

将数字字符串转换为 日期格式问题解答

将任何日期字符串转换为当前文化日期格式

sql server中的怎么把数值型转换为字符串