어떻게 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