首页 > 解决方案 > 如何获得正确的 NSNumber 值和类型?

问题描述

NSNumber通过检查字符串是floatint使用来创建一个字符串NSNumberFormatter。我想要一种方法来返回NSNumber持有的类型和正确的值。它适用于int,但不适用于十进制数。

NSNumber *n;
enum CFNumberType _numberType;

- (instancetype)initWithString:(NSString *)string {
    self = [super init];
    if (self) {
        NSNumberFormatter *formatter = [NSNumberFormatter new];
        decimalPattern = @"\\d+(\\.\\d+)";
        if ([Utils matchString:string withPattern:decimalPattern]) {
            // Float
            formatter.numberStyle = NSNumberFormatterDecimalStyle;
            _numberType = kCFNumberDoubleType;
            n = [formatter numberFromString:string];
        } else {
            // Integer
            formatter.numberStyle = NSNumberFormatterNoStyle;
            _numberType = kCFNumberIntType;
            n = [formatter numberFromString:string];
        }
        self = [self initWithNumber:n];
    }
    return self;
}


- (CFNumberType)value {
    CFNumberType num;  // How to determine the type of num? 
    CFNumberGetValue((CFNumberRef)n, _numberType, &num);
    return num;
}

- (CFNumberType)numberType {
    return _numberType;
}

在该value方法中,如果我指定float num,则它适用于浮点。但我不能使用 float 因为我想让它也适用于 int 。这个怎么做?

标签: objective-cnsnumber

解决方案


我已经找到了解决方案。首先检查数字是否为double并调用适当的值方法。

- (BOOL)isDouble {
    if (_numberType == kCFNumberFloatType || _numberType == kCFNumberFloat32Type || _numberType == kCFNumberFloat64Type || _numberType == kCFNumberDoubleType) {
        return YES;
    }
    return NO;
}

- (double)doubleValue {
    if ([self isDouble]) {
        return [n doubleValue];
    }
    return 0.0;
}

- (int)intValue {
    if (![self isDouble]) {
        return [n intValue];
    }
    return 0;
}

推荐阅读