NSNumberFormatter

NSNumberFormatter : NSFormatter

1、系统默认的格式

  • 配置格式化行为
// 没试出什么不同来,可能差距不大,不太清楚;
    [NSNumberFormatter setDefaultFormatterBehavior:NSNumberFormatterBehaviorDefault];
  • 配置格式化样式
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
    NSNumber *number = @1234567890.0987654321;
    NSString *numberString = [numberFormatter stringFromNumber:numner];
    NSLog(@"%@", numberString);

    // 枚举
    typedef NS_ENUM(NSUInteger, NSNumberFormatterStyle) {
        NSNumberFormatterNoStyle,  无格式,四舍五入成整数 1234567890
        NSNumberFormatterDecimalStyle,  小数分割形式‘,’分割,保留 3 位小数 1,234,567,890.099
        NSNumberFormatterCurrencyStyle,  货币形式 $1,234,567,890.10
        NSNumberFormatterPercentStyle,  百分比形式 123,456,789,010%
        NSNumberFormatterScientificStyle,  科学记数法 1.23456789009877E9
        NSNumberFormatterSpellOutStyle,  英语读法 one billion two hundred...
        NSNumberFormatterOrdinalStyle (ios(9.0)),  排序形式,整数后缀 th 1,234,567,890th
        NSNumberFormatterCurrencyISOCodeStyle (ios(9.0)),  ISOCode(不懂) 342,936:32:30
        NSNumberFormatterCurrencyPluralStyle (ios(9.0)),  复杂货币形式 USD1,234,567,890.10
        NSNumberFormatterCurrencyAccountingStyle (ios(9.0)),  账户货币形式 1,234,567,890.10 US dollars
    };
  • 格式化字符串转换成 NSNumber 还是 NSDecimalNumber
    numberFormatter.generatesDecimalNumbers = NO;
    NSNumber *decimalNumber1 = [numberFormatter numberFromString:string];
    
    numberFormatter.generatesDecimalNumbers = YES;
    NSDecimalNumber *decimalNumber2 = (NSDecimalNumber *)[numberFormatter numberFromString:string];

2、格式化转化

  • 复杂方式 NSString -> NSNumber
    NSNumber *resNumber;
    NSError *error;
    NSRange range = NSMakeRange(1, 2);
    BOOL res = [numberFormatter getObjectValue:&resNumber forString:string range:&range error:&error];
    if (res && !error) {
        NSLog(@"%@", resNumber);
    }
  • 简单方式 NSString -> NSNumber
    NSNumber *string2Number = [numberFormatter numberFromString:string];
  • 简单方式 NSNumber -> NSString
    NSString *number2String = [numberFormatter stringFromNumber:numner];
  • 最简单方式 NSNumber -> NSString
    NSString *number2String2 = [NSNumberFormatter localizedStringFromNumber:numner numberStyle:NSNumberFormatterDecimalStyle];

3、舍入方式

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    numberFormatter.roundingMode = NSNumberFormatterRoundHalfEven;// 舍入方式
    numberFormatter.roundingIncrement = @100;// 精度,可以是小数
    NSString *number2String = [numberFormatter stringFromNumber:@(123345)];
    NSLog(@"%@", number2String);
    
    //    typedef NS_ENUM(NSUInteger, NSNumberFormatterRoundingMode) {
    //        NSNumberFormatterRoundCeiling, 正无穷方向
    //        NSNumberFormatterRoundFloor, 负无穷方向
    //        NSNumberFormatterRoundDown, 趋近 0 方向
    //        NSNumberFormatterRoundUp, 远离 0 方向
    //        NSNumberFormatterRoundHalfEven, 趋近最近数,大小平均,精度留双
    //        NSNumberFormatterRoundHalfDown, 趋近最近数,大小平均,趋近 0 方向
    //        NSNumberFormatterRoundHalfUp 趋近最近数,大小平均,远离 0 方向
    //    };

4、自定义

自定义很多配置都与格式化样式互相关联而又相互制约,比较麻烦;

  • 格式
//    numberFormatter.formattingContext = @"";// 未知
    numberFormatter.formatWidth = 3;// 未知
    numberFormatter.positiveFormat = @"¤#,###0.###";// 正数格式(¤ 指代货币符号)
    numberFormatter.negativeFormat = @"¤-#,##0.##";// 负数格式()
    numberFormatter.multiplier = @(10);// 结果倍数
  • 符号
    numberFormatter.percentSymbol = @"百分之";
    numberFormatter.perMillSymbol = @"perMillSymbol";
    numberFormatter.minusSign = @"减";
    numberFormatter.plusSign = @"加";
    numberFormatter.exponentSymbol = @"指数";
    numberFormatter.zeroSymbol = @"零";
    numberFormatter.nilSymbol = @"空";
    numberFormatter.notANumberSymbol = @"不是一个数";
    numberFormatter.negativeInfinitySymbol = @"负无穷";
    numberFormatter.positiveInfinitySymbol = @"正无穷";
  • 货币
    numberFormatter.currencySymbol = @"货币符号";// 与 currencyCode 冲突,优先
    numberFormatter.currencyCode = @"EUR";// 货币符号代码
    numberFormatter.internationalCurrencySymbol = @"国际货币符号";// 未知
    numberFormatter.currencyGroupingSeparator = @"$$";// 代替分隔符,
  • 前后缀
    numberFormatter.positivePrefix = @"正数前缀";
    numberFormatter.positiveSuffix = @"正数后缀";
    numberFormatter.negativePrefix = @"负数前缀";
    numberFormatter.negativeSuffix = @"负数后缀";
  • 分组
    numberFormatter.groupingSeparator = @"分组符";
    numberFormatter.usesGroupingSeparator = YES;
    numberFormatter.decimalSeparator = @"小数点";
    numberFormatter.alwaysShowsDecimalSeparator = YES;
    numberFormatter.groupingSize = 3;// 1 级分组
    numberFormatter.secondaryGroupingSize = 2;// 2 级分组
    
    numberFormatter.currencyGroupingSeparator = @"货币分组符";
  • padding(不明所以)
    numberFormatter.paddingCharacter = @"??";
    numberFormatter.paddingPosition = NSNumberFormatterPadAfterSuffix;
    
//    typedef NS_ENUM(NSUInteger, NSNumberFormatterPadPosition) {
//        NSNumberFormatterPadBeforePrefix,
//        NSNumberFormatterPadAfterPrefix,
//        NSNumberFormatterPadBeforeSuffix,
//        NSNumberFormatterPadAfterSuffix
//    };
  • In Out(不明所以)
    numberFormatter.allowsFloats = NO;
    numberFormatter.minimum = @(-1000);
    numberFormatter.maximum = @(1000);
  • 位数
    numberFormatter.minimumIntegerDigits = 2;// 最小整数位数
    numberFormatter.maximumIntegerDigits = 3;// 最大整数位数

    numberFormatter.minimumFractionDigits = 4;// 最小小数位数
    numberFormatter.maximumFractionDigits = 5;// 最大小数位数
  • 有效位数
    numberFormatter.minimumSignificantDigits = 6;// 最小有效位数
    numberFormatter.maximumSignificantDigits = 7;// 最大有效位数
  • 其他(不明所以)
    numberFormatter.lenient = NO;
    numberFormatter.partialStringValidationEnabled = NO;