[objective-c] NSString을 NSNumber로 변환하는 방법

어떻게 a를 변환 할 수 있습니다 NSString(예를 들어, 모든 원시 데이터 유형의 다수 포함 int, float, char, unsigned int, 등)? 문제는 런타임에 문자열에 어떤 숫자 유형이 포함 될지 모른다는 것입니다.

나는 그것을하는 방법에 대한 아이디어가 있지만 이것이 어떤 유형, 부호없는 부동 소수점 값에서도 작동하는지 확실하지 않습니다.

long long scannedNumber;
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanLongLong:&scannedNumber]; 
NSNumber *number = [NSNumber numberWithLongLong: scannedNumber];

도와 주셔서 감사합니다.



답변

사용 NSNumberFormatter:

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *myNumber = [f numberFromString:@"42"];

문자열이 유효한 숫자가 아닌 경우, 다음 myNumber될 것입니다 nil. 유효한 숫자이면 이제 NSNumber실제로 어떤 종류의 숫자인지 알아내는 것이 좋습니다.


답변

당신은 사용할 수 있습니다 -[NSString integerValue], -[NSString floatValue]등 그러나,이 작업을 수행하는 올바른 (로케일에 의존하는 등) 방법을 사용하는 것입니다 -[NSNumberFormatter numberFromString:]의 설정의 NSNumber 해당 로케일로 변환을 포기하고 주어진 것이다 NSNumberFormatter는 부동 허용 여부 (를 포함하여 포인트 값).


답변

목표 -C

(참고 :이 방법은 차이 로케일에서는 좋지 않지만 a보다 약간 빠릅니다. NSNumberFormatter)

NSNumber *num1 = @([@"42" intValue]);
NSNumber *num2 = @([@"42.42" floatValue]);

빠른

간단하지만 더러운 방법

// Swift 1.2
if let intValue = "42".toInt() {
    let number1 = NSNumber(integer:intValue)
}

// Swift 2.0
let number2 = Int("42')

// Swift 3.0
NSDecimalNumber(string: "42.42") 

// Using NSNumber
let number3 = NSNumber(float:("42.42" as NSString).floatValue)

확장 방식
로케일과 소수로 훌륭하게 재생되므로 실제로 더 좋습니다.

extension String {

    var numberValue:NSNumber? {
        let formatter = NSNumberFormatter()
        formatter.numberStyle = .DecimalStyle
        return formatter.number(from: self)
    }
}

이제 간단하게 할 수 있습니다 :

let someFloat = "42.42".numberValue
let someInt = "42".numberValue


답변

정수로 시작하는 문자열의 경우 예를 들어, @"123", @"456 ft", @"7.89", 등, 사용 -[NSString integerValue].

따라서 @([@"12.8 lbs" integerValue])하는 것과 같습니다 [NSNumber numberWithInteger:12].


답변

당신은 또한 이것을 할 수 있습니다 :

NSNumber *number = @([dictionary[@"id"] intValue]]);

즐기세요!


답변

정수를 받는다는 것을 알고 있다면 다음을 사용할 수 있습니다.

NSString* val = @"12";
[NSNumber numberWithInt:[val intValue]];


답변

NSNumberFormatter가 현지화 된 숫자 NSString (xCode 3.2.4, osX 10.6)을 읽는 방금 샘플을 작성하여 방금 엉망인 시간을 절약 할 수 있습니다. 주의 : 후행 공백 ( “8,765.4”작동)을 처리 할 수 ​​있지만 선행 공백은 처리 할 수없고 흩어진 텍스트 문자는 처리 할 수 ​​없습니다. (잘못된 입력 문자열 : “8”및 “8q”및 “8 q”.)

NSString *tempStr = @"8,765.4";  
     // localization allows other thousands separators, also.
NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
[myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
[myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
     // next line is very important!
[myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial

NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'", 
    tempStr, tempNum, [tempNum intValue]);
[myNumFormatter release];  // good citizen