描述:假设要求数据最多保留两位小数,如果以上条件成立,还要求此数据最后一位小数上如果是0的话,就舍掉最后一位上的0。
比如:89.90000000000001->89.90->89.9。
分析:一般可以创建一个新的字符串工具类,继承NSString,可是这样的话就多了一个类。 另一种方法:给NSString添加一个分类。
NSString+Extension.m
@implementation NSString (Extension)
- (instancetype)dealedPriceString {
// 处理过的字符串
NSString *newString = self;
// 小数点的位置
NSUInteger dotLoc = [newString rangeOfString:@"."].location;
if (dotLoc != NSNotFound) {
// 小数位数
NSUInteger decimalCount = newString.length - dotLoc - 1;
// 小数位数过多
if (decimalCount > 2) {
// 89.90000000000001 -> 89.90
newString = [newString substringToIndex:dotLoc + 3];
if ([newString hasSuffix:@"0"]) {
//89.90-> 89.9
newString = [newString substringToIndex:newString.length - 1];
}
}
}
return newString;
} @end
使用场景 : 最好在重写模型属性(此属性的成员变量里放的是将来处理好的要显示的最终数据)的set方法时,让需要处理的字符串对象调用此方法,比如:
- (void)setCurrent_price:(NSString *)current_price { _current_price = current_price.dealedPriceString; }
PS:
在分类只能增加方法,不能增加成员变量,如果要增加成员变量的话该考虑用继承去实现
在分类实现方法中可以访问类中的成员变量但是不能访问类中的属性@property
在分类中可以重新实现原类中的方法,但会将原类中的方法覆盖而失效。因为在执行对象成员方法的时候会优先去分类中查找,然后再去原类中去查找,最后去父类中去查找。但是一般不建议么做!
如果一个类有多个分类,而且分类中有同名的方法那么最后编译的分类会将前面编译的分类覆盖而执行输出
总结:
依据分类这一思想:如果一个类中有很多实现功能的方法,那么可以将每一个功能方法单独写成分类,让具体的分类来管理具体的功能!这样的话如果其他类要实现同样功能就可以直接调用分类。
在实际开发中一般不建议给自定义的类写分类,一般情况下都是为系统自带的类写分类 。