2016-08-19 69 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