NSString을 NSNumber로 변환하는 방법


569

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

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

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

도와 주셔서 감사합니다.

답변:


1245

사용 NSNumberFormatter:

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

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


16
작동하지 않는 사람들의 경우 : 해당 지역과 관련이 있는지 확인하십시오. NSNumberFormatter (내가 아는 한)는 기본적으로 미국 로케일을 사용합니다. 즉, 소수점 구분 기호는 "."입니다. 캐릭터. ","를 사용하여 분수를 분리하는 경우 현재 로케일을 사용하도록 포맷터에 지시해야합니다. [f setLocale : [NSLocale currentLocale]];
pille

2
@pille 기본적으로 로케일은입니다. +currentLocale그러나 맞습니다. 물건을 사람이 읽을 수있는 형식으로 변환 할 때 항상 로케일을 고려해야합니다.
Dave DeLong

기본적으로 currentLocale이라는 곳은 어디입니까? 쉼표가 사용되는 프랑스 전화에서도 numberFromString이 점 표기법을 사용하고 있음을 확인할 수 있습니다. 당신이 숫자는 기본적으로 현재 로케일을 사용하여 출력 할 때 나는 기본적으로 다음 사항을 확인 할 수 있습니다
앨 라이

그러나 문자열에 int 또는 float이 포함될 수 있다면 어떨까요?
GeneCode

179

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


27
+ q 상황에 따라 로케일을 구분하지 않는 것이 실제로 올바른 방법 일 수 있습니다.
Thilo

2
나는로 변환 @"2000"해야 int했고 [@"2000" integerValue]훌륭하게 일했으며 내 경우에는 조금 더 간단합니다.
Besi

2
이 방법들 사이에는 큰 성능 차이가 있습니다.
Tom Andersen

2
ARC에서는 작동하지 않습니다. NSInteger를 NSNumber로 변환하지 않습니다. 더 사용해야합니다[NSNumber numberWithInteger ...]
학습자

@Thilo가 말한 것. "올바른"및 "로케일 구분"은 동의어가 아닙니다. 실제로 올바른 일은 숫자가 어떻게 문자열에 들어 갔는지에 달려 있습니다. 사용자 입력에서 읽은 경우 로컬에 민감합니다. 다른 소스 (예 : 프로그래밍 방식으로 작성하면 일부 외부 API 등의 응답의 일부로 소스를 사용함)에서 로컬 감지는 적합하지 않으며 잘못된 결과를 줄 수도 있습니다.
aroth

138

목표 -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

1
대량의 문자열 값을 구문 분석 할 때 프로파일 링을 기반으로 이것을 선호합니다. NSNumberFormatter 대신이 구문을 사용하면 문자열을 NSNumber로 구문 분석하는 데 소요되는 시간이 크게 줄어 듭니다. 그리고 네, NSNumberFormatter는 캐시되어 재사용되었습니다.
androider

3
이 질문을 받았을 때이 리터럴 구문은 존재하지 않았습니다. 나는 이것이 오늘날 정답이라고 말하고 싶습니다.
Chris

1
나는 다른 국가가 사용하는 것이 동의하지만, 메모를 할 ,.다른 방법의 주위에 (예 42.000,42. 뭔가 floatValue? 아마 고려하지 않습니다
케빈 R

1
이것은 여기에서 가장 좋은 해결책이지만, 방금 테스트를 실행했으며 부호없는 정밀도를 잃어 버릴 것입니다.
Stoff81

내 유스 케이스에서는 NSString에서 NSNumber 사전 키를 가져와야 @([@"42" intValue])완벽하게 작동했습니다. 로캘에 대해 걱정하지 마십시오.
Chuck Krutsinger

86

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

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


50

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

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

즐기세요!


26

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

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

11

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

이것은 나를 위해 작동하지 않습니다. xcode 4.3.2로 5.0을 개발 중입니다. 왜 어떤 아이디어?
acecapades


5

모두 감사합니다! 피드백을 결합하여 마침내 텍스트 입력 (string)에서 정수로 변환 할 수 있습니다. 또한 입력이 정수인지 여부를 알 수 있습니다 :)

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * myNumber = [f numberFromString:thresholdInput.text];

int minThreshold = [myNumber intValue]; 

NSLog(@"Setting for minThreshold %i", minThreshold);

if ((int)minThreshold < 1 )
{
    NSLog(@"Not a number");
}
else
{
    NSLog(@"Setting for integer minThreshold %i", minThreshold);
}
[f release];

4

NSDecimalNumber가 그렇게 할 것이라고 생각합니다.

예:

NSNumber *theNumber = [NSDecimalNumber decimalNumberWithString:[stringVariable text]]];

NSDecimalNumber는 NSNumber의 서브 클래스이므로 내재 된 캐스팅이 허용됩니다.


2

C의 표준은 atoi어떻습니까?

int num = atoi([scannedNumber cStringUsingEncoding:NSUTF8StringEncoding]);

경고가 있다고 생각하십니까?



2

이 코드처럼 할 수 있습니다 8.3.3 iOS 10.3 지원

[NSNumber numberWithInt:[@"put your string here" intValue]]

1
NSDecimalNumber *myNumber = [NSDecimalNumber decimalNumberWithString:@"123.45"];
NSLog(@"My Number : %@",myNumber);

0

스위프트 3 에서 근무

NSDecimalNumber(string: "Your string") 

0

나는 이것이 매우 늦었지만 아래 코드가 나를 위해 일하고 있음을 알고 있습니다.

이 코드를 사용해보십시오

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

도움이 될 수 있습니다. 감사


0

이 시도

NSNumber *yourNumber = [NSNumber numberWithLongLong:[yourString longLongValue]];

참고-필자의 요구 사항에 따라 longLongValue를 사용했습니다. integerValue, longValue 또는 요구 사항에 따라 다른 형식을 사용할 수도 있습니다.


-1
extension String {

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

let someFloat = "12.34".numberValue
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.