首页 > 络空间安全 正文
iOS 金额字符串格式化显示的方法

时间:2022-11-20 21:16:12 阅读: 评论: 作者:

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

  在一些金融类的 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 appString:@".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: ٪۴۰۰."

  如果以上的方法帮助到你了,欢迎分享,有需要可以随时私信作者。