582 Stimmen

Konvertierung eines NSString in eine NSNumber

Wie kann ich eine NSString mit einer Zahl eines beliebigen primitiven Datentyps (z. B. int , float , char , unsigned int , usw.)? Das Problem ist, dass ich nicht weiß, welchen Zahlentyp die Zeichenfolge zur Laufzeit enthalten wird.

Ich habe eine Idee, wie man das macht, aber ich bin mir nicht sicher, ob das mit jedem Typ funktioniert, auch mit vorzeichenlosen und Fließkommawerten:

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

Vielen Dank für die Hilfe.

1268voto

Dave DeLong Punkte 240835

Verwenden Sie eine NSNumberFormatter :

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

Wenn die Zeichenkette keine gültige Zahl ist, dann myNumber wird sein nil . Wenn es sich um eine gültige Nummer handelt, dann haben Sie jetzt alle NSNumber die Güte, herauszufinden, um was für eine Zahl es sich eigentlich handelt.

183voto

Barry Wark Punkte 106328

Sie können verwenden -[NSString integerValue] , -[NSString floatValue] , usw. Die korrekte (ortsabhängige usw.) Vorgehensweise ist jedoch die Verwendung von -[NSNumberFormatter numberFromString:] die Ihnen eine NSNummer liefert, die aus dem entsprechenden Gebietsschema konvertiert wurde und die Einstellungen des Befehls NSNumberFormatter (einschließlich der Frage, ob sie Fließkommazahlen zulässt).

147voto

Kevin R Punkte 7620

Objektiv-C

(Hinweis: Diese Methode ist nicht kompatibel mit unterschiedlichen Gebietsschemata, ist aber etwas schneller als eine NSNumberFormatter )

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

Schnell

Einfacher, aber schmutziger Weg

// 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)

Der Verlängerungsweg Das ist wirklich besser, weil es gut mit Gebietsschemata und Dezimalzahlen funktioniert.

extension String {

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

Jetzt können Sie einfach tun:

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

87voto

ma11hew28 Punkte 112879

Für Zeichenketten, die mit ganzen Zahlen beginnen, z.B., @"123" , @"456 ft" , @"7.89" , usw., verwenden -[NSString integerValue] .

Also, @([@"12.8 lbs" integerValue]) ist wie das Tun [NSNumber numberWithInteger:12] .

51voto

MacMark Punkte 6019

Sie können auch dies tun:

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

Viel Spaß!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X