NSNumberFormatter提供兩個方便方法,stringFromNumber: 和 numberFromString:,前者你用以創(chuàng)建數(shù)字的字符串表示法,后者用以創(chuàng)建來自字符串的數(shù)字對象。想要在不創(chuàng)建格式化器對象的情況下創(chuàng)建數(shù)字的本地化的字符串表示法,你可以使用類方法localizedStringFromNumber:numerStyle:。
如果你在解析字符串的時(shí)候有更加復(fù)雜的要求,除了使用繼承自NSFormatter的方法之外,getObjectValue:forString:range:error:方法允許你指定被解析字符串的子串,并且返回真實(shí)解析了字符串范圍。(在出錯的情況下,它指明錯誤發(fā)生的位置。)它還返回NSError對象,它包含關(guān)于錯誤的豐富信息。
數(shù)字格式化器有多個屬性可以讀寫。當(dāng)你把信息顯示給用戶的時(shí)候,你通常應(yīng)該使用NSNumberFormatter樣式常量,這些常量預(yù)定義了一組決定格式化數(shù)據(jù)如何顯示的屬性。但是,如果你需要以精確的格式生成數(shù)字的表示法,你應(yīng)該使用格式字符串。
使用格式化器樣式來呈現(xiàn)用戶偏好的數(shù)字
NSNumberFormatter可以讓你很容易的使用用戶配置在系統(tǒng)偏好的“國際偏好”面板中的設(shè)置來格式化不同的數(shù)字分類。NSNumberFormatter樣式常量——NSNumberFormatterDecimalStyle, NSNumberFormatterCurrencyStyle, NSNumberFormatterPercentStyle, NSNumberFormatterScientificStyle, 或 NSNumberFormatterSpellOutStyle(它生成一個數(shù)字的原文表示法)——指定一組屬性,它們依據(jù)用戶的偏好來確定如何顯示數(shù)字。
你可以使用setNumberStyle:方法來指定數(shù)字格式化器的樣式。代碼清單1演示了你可以使用格式化器樣式格式化日期。
代碼清單 1 使用格式化器樣式格式化數(shù)字
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.4563];
NSLog(@"formattedNumberString: %@", formattedNumberString);
// Output for locale en_US: "formattedNumberString: formattedNumberString: 122,344.453"
使用格式字符串來指定自定義格式
格式字符串使用來自Unicode Technical Standard #35的格式模式。不同的操作系統(tǒng)版本使用不同標(biāo)準(zhǔn)的版本:
- OS X v10.9 和 iOS 7 使用 version tr35-31.
- OS X v10.8 和 iOS 6 使用 version tr35-25.
- iOS 5 使用 version tr35-19.
- OS X v10.7 和 iOS 4.3 使用 version tr35-17.
- iOS 4.0, iOS 4.1, 和 iOS 4.2 使用 version tr35-15.
- iOS 3.2 使用 version tr35-12.
- OS X v10.6, iOS 3.0, 和 iOS 3.1 使用 version tr35-10.
- OS X v10.5 使用 version tr35-6.
- OS X v10.4 使用 version tr35-4.
注意Unicode格式字符串的格式,你應(yīng)該在格式字符串中的字面量放在兩個撇號之間('')。
你使用setPositiveFormat:和setNegativeFormat:方法來指定數(shù)字格式化器的格式字符串。代碼清單2演示了你如何使用格式化器樣式格式化一個日期。
代碼清單 2 使用格式字符串格式化數(shù)字
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"###0.##"];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.4563];
NSLog(@"formattedNumberString: %@", formattedNumberString);
// Output for locale en_US: "formattedNumberString: formattedNumberString: 122,344.45"
百分比
如果你使用帶有“%”字符的格式字符串來格式化百分比,那結(jié)果可能會混亂。思考下面這個例子:
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"0.00%"];
NSLog(@"%@", [numberFormatter stringFromNumber:@4.0]);
// Output: "400.00%".
因?yàn)楦袷阶址褂冒俜直葋碇付ǎ訬SNumberFormatter把數(shù)字4解釋為一個分?jǐn)?shù)(1就是100%),也就是4 = 4 / 1 = 400%。
如果你想以百分比來表現(xiàn)數(shù)字,你應(yīng)該使用NSNumberFormatterPercentStyle樣式,它還確保百分比適應(yīng)于語言環(huán)境:
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterPercentStyle];
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[numberFormatter setLocale:usLocale];
NSLog(@"en_US: %@", [numberFormatter stringFromNumber:@4.0]);
// Output: "en_US: 400%".
NSLocale *faLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"fa_IR"];
[numberFormatter setLocale:faLocale];
NSLog(@"fa_IR: %@", [numberFormatter stringFromNumber:@4.0]);
// Output: "fa_IR: ????."
命名法
NSNumberFormatter提供多個方法(例如,setMaximumFractioinDigits:)允許你管理實(shí)例允許輸入的小數(shù)位數(shù)。“小數(shù)”是小數(shù)操作符(在英語國家,小數(shù)操作符通常指的就是小數(shù)點(diǎn))后面的數(shù)字。