在iOS开发中,和货币价格计算相关的,需要注意计算精度的问题。即使只是两位小数,也会出现误差。比如字符串转换成float,两个float运算再转成字符串的时候就可能会丢失精度。
解决这个问题就用到了苹果的 NSDecimalNumber 这个类 可以将两个字符串进行运算并且自动返回字符串,解决了同学们转换类型计算丢失进度的烦恼
可参考:https://www.cnblogs.com/niceMan/p/5910528.html
下面提供两个添加(去除)千位符的方法
10000 --> 10,000
- (NSString *)strmethodComma
{
NSString *string = self;
if (string.length <= 3) {
return string;
}
NSString *sign = nil;
if ([string hasPrefix:@"-"]||[string hasPrefix:@"+"]) {
sign = [string substringToIndex:1];
string = [string substringFromIndex:1];
}
NSArray *signs = [string componentsSeparatedByString:@"."];
string = signs[0];
if (string.length <= 3 && signs.count == 2) {
string = [string stringByAppendingString:[NSString stringWithFormat:@".%@",signs[1]]];
if (sign) {
string = [sign stringByAppendingString:string];
}
return string;
}
NSString *pointLast = [string substringFromIndex:[string length]-3];
NSString *pointFront = [string substringToIndex:[string length]-3];
NSInteger commaNum = ([pointFront length]-1)/3;
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < commaNum+1; i++) {
NSInteger index = [pointFront length] - (i+1)*3;
NSInteger leng = 3;
if(index < 0)
{
leng = 3+index;
index = 0;
}
NSRange range = {index,leng};
NSString *stq = [pointFront substringWithRange:range];
[arr addObject:stq];
}
NSMutableArray *arr2 = [NSMutableArray array];
for (NSInteger i = [arr count]-1; i>=0; i--) {
[arr2 addObject:arr[i]];
}
[arr2 addObject:pointLast];
NSString *commaString = [arr2 componentsJoinedByString:@","];
if (sign) {
commaString = [sign stringByAppendingString:commaString];
}
if (signs.count == 2) {
commaString = [commaString stringByAppendingString:[NSString stringWithFormat:@".%@",signs[1]]];
}
return commaString;
}
10,000,003.050 -> 1,000.000305
- (NSString *)wanStrmethodComma
{
NSString *str = [self stringByReplacingOccurrencesOfString:@"," withString:@""];
NSDecimalNumber *totalStr = [NSDecimalNumber decimalNumberWithString:str];
NSDecimalNumber *wanStr = [NSDecimalNumber decimalNumberWithString:@"10000"];
NSDecimalNumber *total = [totalStr decimalNumberByDividingBy:wanStr];
str = [total.stringValue strmethodComma];
return str;
}