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

ios怎么判断json格式(金额字符串格式化显示的方法)(1)

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

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

,