objective-c - 如何获得正确的 NSNumber 值和类型?
问题描述
我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 。这个怎么做?
解决方案
我已经找到了解决方案。首先检查数字是否为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;
}
推荐阅读
- server - Window 服务器许可证的有效期仅为 52 天。52天后会发生什么?
- postgresql - 保险库 - AWS RDS Postgres 集成
- asp.net - asp webforms 文本框验证最多 5 个整数和 *
- r - 使用 R 将 GPX 文件转换为 shapefile
- firebase - Firebase 身份验证批量帐户创建
- powershell - 使用脚本删除 vmWare 快照
- css - 标题中的图像和文本居中
- linux - 如何为 MXE 交叉编译器编译 Berkeley DB 5.3.28?
- python - 防止在 Python 中与基类共享类变量
- multithreading - 如何使用 ThreadPool 通知主线程进行并行计算(PyQt)