New file |
| | |
| | | // |
| | | // 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<scale; i++) { |
| | | str = [str stringByAppendingString:@"0"]; |
| | | } |
| | | return str; |
| | | }else{ |
| | | return arr[0]; |
| | | } |
| | | }else{//没有小数点 |
| | | if ([str rangeOfString:@"."].length) { |
| | | return @""; |
| | | } |
| | | if (scale > 0) { |
| | | str = [str stringByAppendingString:@"."]; |
| | | for (int i = 0; i<scale; i++) { |
| | | str = [str stringByAppendingString:@"0"]; |
| | | } |
| | | return str; |
| | | }else{ |
| | | return str; |
| | | } |
| | | } |
| | | }else{ |
| | | return @""; |
| | | } |
| | | } |
| | | |
| | | NSComparisonResult StrNumCompare(id str1,id str2){ |
| | | return [NSDecimalNumber aDecimalNumberWithStringOrNumberOrDecimalNumber:str1 compareAnotherDecimalNumberWithStringOrNumberOrDecimalNumber:str2]; |
| | | } |
| | | |
| | | NSDecimalNumber *handlerDecimalNumber(id strOrNum,NSRoundingMode mode,int scale){ |
| | | if (!strOrNum) { |
| | | NSLog(@"输入正确类型"); |
| | | return nil; |
| | | }else{ |
| | | NSDecimalNumber *one; |
| | | if ([strOrNum isKindOfClass:[NSString class]]) { |
| | | one = [NSDecimalNumber decimalNumberWithString:strOrNum]; |
| | | }else if([strOrNum isKindOfClass:[NSDecimalNumber class]]){ |
| | | one = strOrNum; |
| | | }else if ([strOrNum isKindOfClass:[NSNumber class]]){ |
| | | one = [NSDecimalNumber decimalNumberWithDecimal:[strOrNum decimalValue]]; |
| | | }else{ |
| | | NSLog(@"输入正确的类型"); |
| | | return nil; |
| | | } |
| | | |
| | | NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:mode scale:scale raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]; |
| | | return [one decimalNumberByRoundingAccordingToBehavior:handler]; |
| | | } |
| | | } |
| | | |
| | | |
| | | NSDecimalNumber *SNAdd(id strOrNum1,id strOrNum2){ |
| | | return [NSDecimalNumber aDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum1 type:Add anotherDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum2 andDecimalNumberHandler:nil]; |
| | | } |
| | | |
| | | NSDecimalNumber *SNSub(id strOrNum1,id strOrNum2){ |
| | | return [NSDecimalNumber aDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum1 type:Subtract anotherDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum2 andDecimalNumberHandler:nil]; |
| | | } |
| | | NSDecimalNumber *SNMul(id strOrNum1,id strOrNum2){ |
| | | return [NSDecimalNumber aDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum1 type:Multiply anotherDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum2 andDecimalNumberHandler:nil]; |
| | | } |
| | | |
| | | NSDecimalNumber *SNDiv(id strOrNum1,id strOrNum2){ |
| | | return [NSDecimalNumber aDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum1 type:Divide anotherDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum2 andDecimalNumberHandler:nil]; |
| | | } |
| | | |
| | | NSComparisonResult SNCompare(id strOrNum1,id strOrNum2){ |
| | | return [NSDecimalNumber aDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum1 compareAnotherDecimalNumberWithStringOrNumberOrDecimalNumber:strOrNum2]; |
| | | } |
| | | |
| | | NSDecimalNumber *SNMin(id strOrNum1,id strOrNum2){ |
| | | return SNCompare(strOrNum1, strOrNum2) > 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 |