NSNumberFormatter.numberFromString()为ar-SA语言环境返回nil

时间:2016-08-19 22:20:05

标签: ios swift uilabel nsnumberformatter

我正在尝试使用UILabelNSNumberFormatter格式化所选区域设置的NSNumberFormatterStyle.DecimalStyle文本,并将格式化程序的区域设置设置为ar-SA

UILabel文本有大数字转换为E表示法(科学记数法)时,例如 - " 1e9"," 2.3456e24"等numberFromString()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符号是否存在限制?

2 个答案:

答案 0 :(得分:2)

您可以将号码转换为" 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

答案 1 :(得分:1)

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

尝试解析2.3456e24仅适用于使用数字0-9,句点以及指数的eE的区域设置。

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