2016-08-19 116 views
3

我想格式化文本UILabel使用NSNumberFormatter选择的语言环境NSNumberFormatterStyle.DecimalStyle和建立区域设置格式化为ar-SANSNumberFormatter.numberFromString()返回nil为AR-SA区域

UILabel文本具有被转化为E符号(科学计数法)为示例 - “1E9”大数“ 2.3456e24”等numberFromString()返回nilar-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符号是否有限制?

+1

请创建[MCVE] – dan

回答

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 
+0

这似乎是正确的方法来转换为默认语言环境或“en”数字,但它不适用于所有区域设置之间的转换。所以,我只是将字符串转换为具有默认语言环境的数字,如果有警卫失败,并且在我的情况下恰好只有“ar-SA”的任何特定语言环境。谢谢您的帮助 ! :) – CuriousDev

1

如果您使用与科学化和阿拉伯区域的NSNumberFormatter格式化NSNumber,你会看到一个数字,如2.3456e24将需要输入为٢٫٣٤٥٦اس٢٤

试图解析2.3456e24只会在使用数字0-9,经过一段时间,并eE的指数区域设置工作。

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

+0

虽然通过Kaique测试修改为每建议,我意识到,遍历所有支持的语言环境,并试图数字格式化用能做到的最好的事情。但是现在,我正在坚持解决方案,就像我上面的评论一样。感谢虽然@rmaddy :) – CuriousDev