美文网首页
iOS数字格式化NSNumberFormatter

iOS数字格式化NSNumberFormatter

作者: 梵生 | 来源:发表于2019-07-11 18:39 被阅读0次

    系统提供的样式

    NSString *string = @"123456.654321";
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = kCFNumberFormatterCurrencyStyle;
    NSNumber *number = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result = [formatter stringFromNumber:number];
    NSLog(@"result is:%@",result);
    
    typedef CF_ENUM(CFIndex, CFNumberFormatterStyle) {  // number format styles
        kCFNumberFormatterNoStyle = 0,    // 自末位开始四舍五入至整数位 123457
        kCFNumberFormatterDecimalStyle = 1,    // 小数点后最多3位 123,456.654
        kCFNumberFormatterCurrencyStyle = 2, // 国际化货币格式 符号与手机系统地区设置有关  $123,456.65
        kCFNumberFormatterPercentStyle = 3,  // 末位由千分位四舍五入得到12,345,665%
        kCFNumberFormatterScientificStyle = 4,  // 1.23456654321E5
        kCFNumberFormatterSpellOutStyle = 5,  // 与项目的国际化语言设置有关  项目支持多个则取第一个语言设置 十二万三千四百五十六点六五四三二一
        kCFNumberFormatterOrdinalStyle = 6,  // 与项目的国际化语言设置有关 末位由十分位四舍五入得到 123,457th
        kCFNumberFormatterCurrencyISOCodeStyle = 8,   // 前缀与手机系统地区设置有关 CNY123,456.65
        kCFNumberFormatterCurrencyPluralStyle = 9,  // 后缀与手机系统地区设置有关  后缀使用的语言与项目的国际化语言设置有关 末位由千分位四舍五入得到 123,456.56 US dollars
        kCFNumberFormatterCurrencyAccountingStyle = 10,  // 前缀与手机系统地区设置有关 末位由千分位四舍五入得到 ¥123,456.65  US$123,456.65  
    };
    

    自定义样式

    关于数字特殊字符 0 和 #的一些简单说明

    #是一个特殊字符,用于数字部分(相当于占位符);它表示显示数字,但是最首位的0不予显示。
    #用于整数部分没有数位的限制,但是用于小数部分,却有“最多只能有多少位小数的意思”,多余的进行四舍五入。

    NSString *string = @"0123456.654555";
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.positiveFormat = @",###.##";
    NSNumber *number = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result = [formatter stringFromNumber:number];
    NSLog(@"result is:%@",result);    // 123,456.65
    formatter.positiveFormat = @"#.###";
    NSNumber *number2 = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result2 = [formatter stringFromNumber:number2];
    NSLog(@"result2 is:%@", result2);   // 123456.655
    

    0和#的用法是相近的,却又略有不同;不同之处在于:
    对于整数部分,0限制整数部分最少出现的位数,不足补0,多出的不变,但是最首位的0不予显示。
    对于小数部分,0限制小数部分最少出现的位数,不足补0,多出的五舍六入

    NSString *string = @"027.65";
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.positiveFormat = @"0000.0000";
    NSNumber *number = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result = [formatter stringFromNumber:number];
    NSLog(@"result is:%@",result);  // 0027.6500
    formatter.positiveFormat = @"0.0";
    NSNumber *number2 = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result2 = [formatter stringFromNumber:number2];
    NSLog(@"result2 is:%@", result2);  // 27.6
    

    其他的特殊样式符号见下表:

    符号 位置 本地化 含义
    0 数字 阿拉伯数字
    # 数字 阿拉伯数字
    . 数字 小数分隔符或货币小数分隔符
    - 数字 减号
    , 数字 分组分隔符
    E 数字 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。
    子模式边界 分隔正数和负数子模式
    % 前缀或后缀 乘以 100 并显示为百分数
    前缀或后缀 乘以 1000 并显示为千分数
    ¤ (\u00A4) 前缀或后缀 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。
    ' 前缀或后缀 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#" 将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号:"# o''clock"。

    常用自定义样式

    NSString *string = @"5277";
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    // 转化为小数点后两位,并前面添加固定货币符号¥
    formatter.positiveFormat = @"¥0.00";
    NSNumber *number = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result = [formatter stringFromNumber:number];
    NSLog(@"result is:%@",result);  // ¥5277.00
    // 转化为小数点后两位,并前面添加固定货币符号¥,并3位一组表示货币
    formatter.positiveFormat = @"¥,##0.00";
    NSNumber *number2 = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result2 = [formatter stringFromNumber:number2];
    NSLog(@"result2 is:%@",result2);  // ¥5,277.00
    // 转化为百分数
    string = @"0.5277";
    formatter.positiveFormat = @"0%";
    NSNumber *number3 = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result3 = [formatter stringFromNumber:number3];
    NSLog(@"result3 is:%@",result3);  // 53%
    // 转化为百分数,并保留一位小数 
    formatter.positiveFormat = @"0.0%";
    NSNumber *number4 = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result4 = [formatter stringFromNumber:number4];
    NSLog(@"result4 is:%@",result4);    // 52.8%
    // 添加任意字符
    formatter.positiveFormat = @"陈拾柒 0.0% 到此一游";
    NSNumber *number5 = [NSNumber numberWithDouble:string.doubleValue];
    NSString *result5 = [formatter stringFromNumber:number5];
    NSLog(@"result5 is:%@",result5);   // 陈拾柒 52.8% 到此一游
    

    参考文献
    Android 中 DecimalFormat 类的官方文档

    相关文章

      网友评论

          本文标题:iOS数字格式化NSNumberFormatter

          本文链接:https://www.haomeiwen.com/subject/litjkctx.html