单军华
2018-07-31 21d3023a9b7b6aff68c1170e345951396b1c6cfd
screendisplay/screendisplay/Classes/Category/ThirdCategory/NSDecimalNumber+Addtion.m
New file
@@ -0,0 +1,210 @@
//
//  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