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]);
,如果你只是想用當前的語言環境。
總結:
- NSDecimalNumber只是存儲。記錄它並不反映任何有關語言環境的內容。
- 爲了讓NSDecimalNumber正確存儲一個數字,它的語言環境需要與預期輸入的語言環境相匹配(
-[NSLocale currentLocale]
在這裏是個不錯的選擇)。
- 爲了顯示給定語言環境正確格式的數字,請使用NSNumberFormatter。
編輯:
好吧,我已經做了這方面的一些更多的研究。
在GNUStep中,它看起來像使用的值NSUserDefaults
(通過快速瀏覽其代碼)結束。
做一些實驗,我發現,有下列情形的影響默認解析行爲,據我可以告訴:
- 在
NSUserDefaults
NSDecimalSeparator
。
AppleLocale
in NSUserDefaults
。
NSLocaleCode
in NSUserDefaults
。
- 設置的值爲
CFBundleDevelopmentRegion
。
- 環境的
LANG
/LC_ALL
/etc ...值。
+[NSLocale systemLocale]
。
而且顯然它不是+[NSLocale currentLocale]
,因爲此問題源於當前語言環境無效的事實。
問題不在於打印,而在於解析。 _「第一個是使用默認數字格式區域設置(en_US)來解析」_ - 我的問題是爲什麼當我的當前區域設置爲fr_FR時,en_US是默認值。因此,當文檔說缺省語言環境依賴時,如果不是當我的當前語言環境是fr_FR時它與en_US有什麼不同? – thejaz 2013-03-21 05:40:35
該文檔沒有說明是什麼導致語言環境成爲「默認」語言環境,儘管它確實使它看起來像可以更改。我最初的想法是它可能與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
我已經提交了文檔雷達,我鼓勵您複製(rdar:// 13520160,http://openradar.appspot.com/radar?id = 2878409);我還爲我的答案增加了更多信息。 – frozendevil 2013-03-27 21:52:46