2013-03-20 56 views
9

根據文檔,[NSDecimalNumber decimalNumberWithString:]應該使用的區域設置小數分隔:NSDecimalNumber decimalNumberWithString:忽略當前區域

無論NSDecimalSeparator是一個週期(如被使用,例如, 在美國)或逗號(例如,在法國使用) 取決於默認語言環境。

但是當我嘗試它,此代碼:

NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]); 
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]); 

給...

100 
100.1 

...作爲輸出雙方的iOS 5和iOS 6。我已經試過瑞典語和法語作爲區域設置,因爲這兩個國家都使用逗號(,)作爲小數點分隔符。

不應該輸出相同嗎?

(我知道我可以使用[NSDecimalNumber decimalNumberWithString:區域:]給力的行爲,所以這個問題不是尋找替代方案,只是如果這是bug還是我做錯了什麼)

回答

6

NSDecimalNumber只是數字型數據的存儲類。它在你傳遞它來創建它的數字的字符串上運行一個解析器(NSNumberFormatter)。你的第二個日誌語句工作「更好」的原因是因爲第一個使用默認的數字格式區域設置(它看起來像它是en_US,但我無法驗證這一點,請參閱編輯打擊以獲取更多信息。)解析,並且「100,1」不是有效的數字,因此「非數字」部分被剝離。通過指定使用「,」十進制分隔符的語言環境,它可以正確捕獲整個數字。

當你NSLog()一個NSDecimalNumber它只是調用-description,它沒有語言環境上下文,可以打印,或多或少,無論它想要什麼。

如果你想打印格式正確的號碼使用NSNumberFormatter像這樣:

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"]; 

NSLog(@"%@", number); 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 

[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]; 

[formatter setLocale:locale]; 

NSLog(@"%@", [formatter stringFromNumber:number]); 

或簡稱

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"]; 
NSLog(@"%@", [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterDecimalStyle]); 

,如果你只是想用當前的語言環境。

總結:

  1. NSDecimalNumber只是存儲。記錄它並不反映任何有關語言環境的內容。
  2. 爲了讓NSDecimalNumber正確存儲一個數字,它的語言環境需要與預期輸入的語言環境相匹配(-[NSLocale currentLocale]在這裏是個不錯的選擇)。
  3. 爲了顯示給定語言環境正確格式的數字,請使用NSNumberFormatter。

編輯:

好吧,我已經做了這方面的一些更多的研究。

在GNUStep中,它看起來像使用的值NSUserDefaults(通過快速瀏覽其代碼)結束。

做一些實驗,我發現,有下列情形的影響默認解析行爲,據我可以告訴:

  1. NSUserDefaultsNSDecimalSeparator
  2. AppleLocale in NSUserDefaults
  3. NSLocaleCode in NSUserDefaults
  4. 設置的值爲CFBundleDevelopmentRegion
  5. 環境的LANG/LC_ALL/etc ...值。
  6. +[NSLocale systemLocale]

而且顯然它不是+[NSLocale currentLocale],因爲此問題源於當前語言環境無效的事實。

+1

問題不在於打印,而在於解析。 _「第一個是使用默認數字格式區域設置(en_US)來解析」_ - 我的問題是爲什麼當我的當前區域設置爲fr_FR時,en_US是默認值。因此,當文檔說缺省語言環境依賴時,如果不是當我的當前語言環境是fr_FR時它與en_US有什麼不同? – thejaz 2013-03-21 05:40:35

+0

該文檔沒有說明是什麼導致語言環境成爲「默認」語言環境,儘管它確實使它看起來像可以更改。我最初的想法是它可能與CFBundleDevelopmentRegion的值設置有關[「通常對應於作者的本地語言」](https://developer.apple.com/library/ios/#documentation/General/Reference /InfoPlistKeyReference/Articles/CoreFoundationKeys.html),但更改該值似乎沒有影響任何行爲。如果API或文檔不清楚,最好的做法是[提供雷達](https://bugreport.apple.com)。 – frozendevil 2013-03-21 07:39:11

+0

我已經提交了文檔雷達,我鼓勵您複製(rdar:// 13520160,http://openradar.appspot.com/radar?id = 2878409);我還爲我的答案增加了更多信息。 – frozendevil 2013-03-27 21:52:46