ios怎么判断json格式(金额字符串格式化显示的方法)
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 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: ٪۴۰۰."
如果以上的方法帮助到你了,欢迎分享,有需要可以随时私信作者。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com