NSNumberFormatter.numberFromString() [=ga=] nil 对于 r-sa 语言环境

NSNumberFormatter.numberFromString() returns nil for ar-SA locale

我正在尝试使用 NSNumberFormatterNSNumberFormatterStyle.DecimalStyle 格式化所选语言环境的 UILabel 文本,并将格式化程序的语言环境设置为 ar-SA

UILabel 文本中的大数字被转换为 E 表示法(科学记数法),例如“1e9”、“2.3456e24”等。numberFromString() returns nil 用于 ar-SA 语言环境。但是,它适用于其他语言环境。

@IBOutlet weak var displayText: UILabel!

let format = NSNumberFormatter()
format.numberStyle = NSNumberFormatterStyle.DecimalStyle
format.locale = NSLocale(localeIdentifier: language)// where language = "ar-SA" or "en-US" or "de-DE"
format.maximumFractionDigits = 16  

var result =  displayText.text! // result = "1e9" or "2.3456e24" 
guard let number = format.numberFromString(result), let string = format.stringFromNumber(number) else {
        displayText.text = "Error"
        return
    }
result = string

如何解决这个问题? ar-SA 语言环境和 E 符号一起使用有什么限制吗?

如果您使用具有科学风格和阿拉伯语区域设置的 NSNumberFormatter 来格式化 NSNumber,您将看到 2.3456e24 之类的数字需要输入为 ٢٫٣٤٥٦اس٢٤.

尝试解析 2.3456e24 仅适用于使用数字 0-9、句点和 eE 作为指数的语言环境。

如果您希望允许用户输入各种格式的数字,您将需要尝试使用多种语言环境的数字格式化程序。从默认语言环境开始。如果返回 nil 数字,请尝试其他语言环境。尝试尽可能多的语言环境。

您可以将数字转换为 "en" 语言环境,然后将结果字符串转换为 "ar_SA" 语言环境。显然,"ar_SA" 语言环境无法识别 "e" 符号。

let format = NSNumberFormatter()
format.numberStyle = NSNumberFormatterStyle.DecimalStyle
format.locale = NSLocale(localeIdentifier: "en")
format.maximumFractionDigits = 16

    var result = displayText.text!
    guard let number = format.numberFromString(result), let string = format.stringFromNumber(number) else {
        return
    }

    format.locale = NSLocale(localeIdentifier: "ar_SA")
    guard let string2 = format.stringFromNumber(number) else {
        return
    }
    result = string2