//
|
// NSNumber+YYAdd.m
|
// YYCategories <https://github.com/ibireme/YYCategories>
|
//
|
// Created by ibireme on 13/8/24.
|
// Copyright (c) 2015 ibireme.
|
//
|
// This source code is licensed under the MIT-style license found in the
|
// LICENSE file in the root directory of this source tree.
|
//
|
|
#import "NSNumber+YYAdd.h"
|
#import "NSString+YYAdd.h"
|
#import "YYCategoriesMacro.h"
|
|
YYSYNTH_DUMMY_CLASS(NSNumber_YYAdd)
|
|
|
@implementation NSNumber (YYAdd)
|
|
+ (NSNumber *)numberWithString:(NSString *)string {
|
NSString *str = [[string stringByTrim] lowercaseString];
|
if (!str || !str.length) {
|
return nil;
|
}
|
|
static NSDictionary *dic;
|
static dispatch_once_t onceToken;
|
dispatch_once(&onceToken, ^{
|
dic = @{@"true" : @(YES),
|
@"yes" : @(YES),
|
@"false" : @(NO),
|
@"no" : @(NO),
|
@"nil" : [NSNull null],
|
@"null" : [NSNull null],
|
@"<null>" : [NSNull null]};
|
});
|
NSNumber *num = dic[str];
|
if (num) {
|
if (num == (id)[NSNull null]) return nil;
|
return num;
|
}
|
|
// hex number
|
int sign = 0;
|
if ([str hasPrefix:@"0x"]) sign = 1;
|
else if ([str hasPrefix:@"-0x"]) sign = -1;
|
if (sign != 0) {
|
NSScanner *scan = [NSScanner scannerWithString:str];
|
unsigned num = -1;
|
BOOL suc = [scan scanHexInt:&num];
|
if (suc)
|
return [NSNumber numberWithLong:((long)num * sign)];
|
else
|
return nil;
|
}
|
// normal number
|
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
|
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
|
return [formatter numberFromString:string];
|
}
|
|
@end
|