iOS开发(OC)汽车公司可能用到的知识点需要马上研究的

iOS 金额字符串格式化显示的方法

2021-11-24  本文已影响0人  小蜜蜂Bee

在一些金融类的 App 中,对于表示金额类的字符串,通常需要进行格式化后再显示出来。例如:

0 --> 0.00

123 --> 123.00

123.456 --> 123.46

102000 --> 102,000.00

10204500 --> 10,204,500.00

它的规则如下:

个位数起每隔三位数字添加一个逗号,同时保留两位小数,也称为“千分位格式”。

我们一开始采取了一种比较笨拙的处理方式如下:

首先根据小数点 . 将传入的字符串分割为两部分,整数部分和小数部分(如果没有小数点,则补 .00,如果有多个小数点则报金额格式错误)。对于小数部分,只取前两位;然后对整数部分字符串进行遍历,从右到左,每三位数前插入一个逗号 ,,最后再把两部分拼接起来,代码大致如下:

- (NSString *)moneyFormat:(NSString *)money {
    if (!money || money.length == 0) {
        return money;
    }

    BOOL hasPoint = NO;
    if ([money rangeOfString:@"."].length > 0) {
        hasPoint = YES;
    }

    NSMutableString *pointMoney = [NSMutableString stringWithString:money];
    if (hasPoint == NO) {
        [pointMoney appendString:@".00"];
    }

    NSArray *moneys = [pointMoney componentsSeparatedByString:@"."];
    if (moneys.count > 2) {
        return pointMoney;
    } else if (moneys.count == 1) {
        return [NSString stringWithFormat:@"%@.00", moneys[0]];
    } else {
        // 整数部分每隔 3 位插入一个逗号
        NSString *frontMoney = [self stringFormatToThreeBit:moneys[0]];
        if ([frontMoney isEqualToString:@""]) {
            frontMoney = @"0";
        }
        // 拼接整数和小数两部分
        NSString *backMoney = moneys[1];
        if ([backMoney length] == 1) {
            return [NSString stringWithFormat:@"%@.%@0", frontMoney, backMoney];
        } else if ([backMoney length] > 2) {
            return [NSString stringWithFormat:@"%@.%@", frontMoney, [backMoney substringToIndex:2]];
        } else {
            return [NSString stringWithFormat:@"%@.%@", frontMoney, backMoney];
        }
    }
}

其中,stringFormatToThreeBit: 方法的实现如下:

- (NSString *)stringFormatToThreeBit:(NSString *)string {
    NSString *tempString = [string stringByReplacingOccurrencesOfString:@"," withString:@""];
    NSMutableString *mutableString = [NSMutableString stringWithString:tempString];
    NSInteger n = 2;
    for (NSInteger i = tempString.length - 3; i > 0; i--) {
        n++;
        if (n == 3) {
            [mutableString insertString:@"," atIndex:i];
            n = 0;
        }
    }
    return mutableString;
}

上述实现看起来非常繁琐。
其实,苹果提供了 NSNumberFormatter 用来处理 NSString 和 NSNumber 之间的转化,可以满足基本的数字形式的格式化。我们通过设置 NSNumberFormatter 的 numberStyle 和 positiveFormat 属性,即可实现上述功能,非常简洁,代码如下:

- (NSString *)formatDecimalNumber:(NSString *)string {
    if (!string || string.length == 0) {
        return string;
    }

    NSNumber *number = @([string doubleValue]);
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = kCFNumberFormatterDecimalStyle;
    formatter.positiveFormat = @"###,##0.00";

    NSString *amountString = [formatter stringFromNumber:number];
    return amountString;
}

同时下面开始讲一下关于NSNumberFormatter介绍和用法:

NSNumberFormatter可以用来处理NSString和NSNumber之间的转化,可以满足基本的数字形式的转化。

1:使用+ localizedStringFromNumber:numberStyle:本地化方法格式化NSNumber到NSString

· 四舍五入到整数

    NSNumber *number = @(123423.5563);
    NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterNoStyle];
// 123424

· 货币数字形式

    NSNumber *number = @(12342323.5563);
    NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterDecimalStyle];
    // 12,342,323.556 

· 货币的形式,带本地化的货币符号

NSNumber *number = @(12342323.5563);
  NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterCurrencyStyle];
// ¥12,342,323.56

· 百分数形式,并且四舍五入到百分比的整数部分

NSNumber *number = @(12342323.5563);
NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterPercentStyle];
// 1,234,232,356%

· 科学计数形式

NSNumber *number = @(12342323.55665); NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterScientificStyle];
// 1.234232355665E7

· 本地化拼写形式

NSNumber *number = @(12342323.55665);
NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterSpellOutStyle];
// 三十四万二千三百二十三点五五六六五

· 序数形式

NSNumber *number = @(12342323.55665);
NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterOrdinalStyle];
// 第1234,2324

· 货币形式 显示ISO分配的货币符号

NSNumber *number = @(12342323.55665);
NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterCurrencyISOCodeStyle];
// CNY12,342,323.56

· 货币形式

NSNumber *number = @(12342323.55665);
 NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterCurrencyPluralStyle];
// 12,342,323.56人民币

· 会计形式

NSNumber *number = @(12342323.55665);
NSString *numStr1 = [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterCurrencyAccountingStyle];
// ¥12,342,323.56

2:初始化NSNumberFormatter对象,使用- (NSNumber *)numberFromString:(NSString *)string;定制格式化NSNumber到NSString

· 不指定任何样式(numStyle),默认(NSNumberFormatterNoStyle)四舍五入,其他的样式同以上1中所介绍的

  NSNumber *number = @(12342323.55665);
  NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init];
// 指定货币样式
  formatter.numberStyle = NSNumberFormatterDecimalStyle;
// 自定义样式
  [formatter setPositiveFormat:@"###0.###"];
// 数字之间的分隔符
  [formatter setDecimalSeparator:@":"];
  [formatter setCurrencyDecimalSeparator:@","];
// 前缀符号
  formatter.positivePrefix = @"!";
// 后缀符号
  formatter.positiveSuffix = @"元";
// 间隙中添加的符号
  formatter.paddingCharacter = @"?";
// 格式的宽度
  formatter.formatWidth = 15;
// 最少展示两位小数
  formatter.minimumFractionDigits = 2;
// 最多展示三位整数
  formatter.maximumIntegerDigits = 5;
  NSString *numStr = [formatter stringFromNumber:number];
// ??????!323:557元

· 百分比样式展示

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"0.00%;0.00%;-0.00%"];
NSLog(@"%@", [numberFormatter stringFromNumber:@4.0]);
// Output: "400.00%".

// 本地化
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: ٪۴۰۰."

如果以上的方法帮助到你了,欢迎分享,也可以直接打开支付宝进行打赏支持作者创作,感谢感谢!

支付宝账号:zouhuaping123@qq.com

欢迎和我交流,企鹅🐧:834537795(小蜜蜂)

上一篇 下一篇

猜你喜欢

热点阅读