// // NSDecimalNumber+Addtion.m // 有应用应用 // // Created by xuliying on 15/10/15. // Copyright (c) 2015年 xly. All rights reserved. // #import "NSDecimalNumber+Addtion.h" @implementation NSDecimalNumber (Addtion) +(NSDecimalNumber *)aDecimalNumberWithStringOrNumberOrDecimalNumber:(id)stringOrNumber1 type:(calculationType)type anotherDecimalNumberWithStringOrNumberOrDecimalNumber:(id)stringOrNumber2 andDecimalNumberHandler:(NSDecimalNumberHandler *)handler{ if (!stringOrNumber2 || !stringOrNumber1) { NSLog(@"输入正确类型"); return nil; } NSDecimalNumber *one; NSDecimalNumber *another; NSDecimalNumber *returnNum; if ([stringOrNumber1 isKindOfClass:[NSString class]]) { one = [NSDecimalNumber decimalNumberWithString:stringOrNumber1]; }else if([stringOrNumber1 isKindOfClass:[NSDecimalNumber class]]){ one = stringOrNumber1; }else if ([stringOrNumber1 isKindOfClass:[NSNumber class]]){ one = [NSDecimalNumber decimalNumberWithDecimal:[stringOrNumber1 decimalValue]]; }else{ NSLog(@"输入正确的类型"); return nil; } if ([stringOrNumber2 isKindOfClass:[NSString class]]) { another = [NSDecimalNumber decimalNumberWithString:stringOrNumber2]; }else if([stringOrNumber2 isKindOfClass:[NSDecimalNumber class]]){ another = stringOrNumber2; }else if ([stringOrNumber2 isKindOfClass:[NSNumber class]]){ another = [NSDecimalNumber decimalNumberWithDecimal:[stringOrNumber2 decimalValue]]; }else{ NSLog(@"输入正确的类型"); return nil; } if (type == Add) { returnNum = [one decimalNumberByAdding:another]; }else if (type == Subtract){ returnNum = [one decimalNumberBySubtracting:another]; }else if (type == Multiply){ returnNum = [one decimalNumberByMultiplyingBy:another]; }else if (type == Divide){ if ([NSDecimalNumber aDecimalNumberWithStringOrNumberOrDecimalNumber:another compareAnotherDecimalNumberWithStringOrNumberOrDecimalNumber:@(0)] == 0) { returnNum = nil; }else returnNum = [one decimalNumberByDividingBy:another]; }else{ returnNum = nil; } if (returnNum) { if (handler) { return [returnNum decimalNumberByRoundingAccordingToBehavior:handler]; }else{ return returnNum; } }else{ NSLog(@"输入正确的类型"); return nil; } } +(NSComparisonResult)aDecimalNumberWithStringOrNumberOrDecimalNumber:(id)stringOrNumber1 compareAnotherDecimalNumberWithStringOrNumberOrDecimalNumber:(id)stringOrNumber2{ if (!stringOrNumber2 || !stringOrNumber1) { NSLog(@"输入正确类型"); stringOrNumber2 = @"0.00"; stringOrNumber1 = @"0.00"; } NSDecimalNumber *one; NSDecimalNumber *another; if ([stringOrNumber1 isKindOfClass:[NSString class]]) { one = [NSDecimalNumber decimalNumberWithString:stringOrNumber1]; }else if([stringOrNumber1 isKindOfClass:[NSDecimalNumber class]]){ one = stringOrNumber1; }else if ([stringOrNumber1 isKindOfClass:[NSNumber class]]){ one = [NSDecimalNumber decimalNumberWithDecimal:[stringOrNumber1 decimalValue]]; }else{ NSLog(@"输入正确的类型"); return -404; } if ([stringOrNumber2 isKindOfClass:[NSString class]]) { another = [NSDecimalNumber decimalNumberWithString:stringOrNumber2]; }else if([stringOrNumber2 isKindOfClass:[NSDecimalNumber class]]){ another = stringOrNumber2; }else if ([stringOrNumber2 isKindOfClass:[NSNumber class]]){ another = [NSDecimalNumber decimalNumberWithDecimal:[stringOrNumber2 decimalValue]]; }else{ NSLog(@"输入正确的类型"); return -404; } return [one compare:another]; } +(NSString *)stringWithDecimalNumber:(NSDecimalNumber *)str1 scale:(NSInteger)scale{ if (!str1) { return @""; } NSString *str = [NSString stringWithFormat:@"%@",str1]; if (str && str.length) { if ([str rangeOfString:@"."].length == 1) {//有小数点 NSArray *arr = [str componentsSeparatedByString:@"."]; if (scale > 0) { NSInteger count = [arr[1] length]; for (NSInteger i = count; i 0) { str = [str stringByAppendingString:@"."]; for (int i = 0; i 0 ? strOrNum2 : strOrNum1; } NSDecimalNumber *SNMax(id strOrNum1,id strOrNum2){ return SNCompare(strOrNum1, strOrNum2) > 0 ? strOrNum1 : strOrNum2; } NSDecimalNumber *SNAdd_handler(id strOrNum1,id strOrNum2,NSRoundingMode mode,int scale){ return handlerDecimalNumber(SNAdd(strOrNum1, strOrNum2), mode, scale); } NSDecimalNumber *SNSub_handler(id strOrNum1,id strOrNum2,NSRoundingMode mode,int scale){ return handlerDecimalNumber(SNSub(strOrNum1, strOrNum2), mode, scale); } NSDecimalNumber *SNMul_handler(id strOrNum1,id strOrNum2,NSRoundingMode mode,int scale){ return handlerDecimalNumber(SNMul(strOrNum1, strOrNum2), mode, scale); } NSDecimalNumber *SNDiv_handler(id strOrNum1,id strOrNum2,NSRoundingMode mode,int scale){ return handlerDecimalNumber(SNDiv(strOrNum1, strOrNum2), mode, scale); } NSDecimalNumber *SNMin_handler(id strOrNum1,id strOrNum2,NSRoundingMode mode,int scale){ return handlerDecimalNumber(SNMin(strOrNum1, strOrNum2), mode, scale); } NSDecimalNumber *SNMax_handler(id strOrNum1,id strOrNum2,NSRoundingMode mode,int scale){ return handlerDecimalNumber(SNMax(strOrNum1, strOrNum2), mode, scale); } @end