Как получить правильное значение и тип NSNumber? - PullRequest
0 голосов
/ 07 апреля 2019

Я создаю NSNumber из строки, проверяя, является ли строка float или int с использованием 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.Как это сделать?

1 Ответ

0 голосов
/ 07 апреля 2019

Я нашел решение для этого.Сначала проверьте, является ли число 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;
}
...