123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- //
- // NSNumber+YYAdd.m
- // YYKit <https://github.com/ibireme/YYKit>
- //
- // 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 "YYKitMacro.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]};
- });
- id num = dic[str];
- if (num) {
- if (num == [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
|