Holen Sie sich schnell einen ganzzahligen Wert aus dem String


134

Also kann ich das machen:

var stringNumb: NSString = "1357"

var someNumb: CInt = stringNumb.intValue

Aber ich kann den Weg nicht finden, es w / a zu tun String. Ich möchte etwas tun wie:

var stringNumb: String = "1357"

var someNumb: Int = Int(stringNumb)

Das funktioniert auch nicht:

var someNumbAlt: Int = myString.integerValue

1
var someNumb: Int? = Int(stringNumb)odervar someNumb = Int(stringNumb)
SwiftArchitect

Antworten:


179

Mit Swift 2.0 können Sie Integer mit dem Konstruktor initialisieren

var stringNumber = "1234"
var numberFromString = Int(stringNumber)

14
Ab Swift 2.0 haben Sie die toInt()Methode nicht mehr als Teil von String. Dieser IntKonstruktor ist nun die einzige Möglichkeit, Zeichenfolgen in Ints zu konvertieren.
Morgan Wilde

1
Das Semikolon ist nicht erforderlich
Sebastian

Können Sie bitte sagen, wie zu behandeln ist, wenn der Benutzer mehr als eine Int64-Grenzwertnummer in das Textfeld
eingibt

1
@ Sebastian ist das nicht frustrierend? :)
Victor

94

Ich würde verwenden:

var stringNumber = "1234"
var numberFromString = stringNumber.toInt()
println(numberFromString)

Hinweis toInt():

Wenn die Zeichenfolge eine Ganzzahl darstellt, die in ein Int passt, wird die entsprechende Ganzzahl zurückgegeben.


5
Dies hat funktioniert, obwohl Sie, wenn Sie die var someNumb: Int = stringNumber.toInt()!Variable explizit deklarieren, ein Ausrufezeichen hinzufügen müssen: wie @NateCook hervorhob
Logan

Ich erkläre es nicht explizit. Der Compiler weiß, dass numberFromString ein int sein sollte, da es als eins initialisiert ist ...
CW0007007

Ich weiß, dass du es nicht bist, aber ich bin es. Ich musste diese Anpassung vornehmen, um dies zu tun. Ihr Code ist korrekt, fügen Sie ihn einfach als Kommentar hinzu.
Logan

Ja, es wird nur dann ein Wert zurückgegeben, wenn der Wert in ein Int passt, wie in der Notiz angegeben. Andernfalls wird null zurückgegeben ...
CW0007007

5
Anstatt !den Aufruf anzulegen, können Sie Ihre Variable als optional deklarieren : someNumb: Int? = stringNumber.toInt(). Dann wird das Typensicherheitssystem wissen, dass es foomöglicherweise nicht existiert. Das Putten !stürzt natürlich ab, wenn Ihre Zeichenfolge nicht in eine Zahl konvertiert werden kann.
Gwcoffey

18

In Swift 3.0

Typ 1: Konvertieren Sie NSString in String

    let stringNumb:NSString = "1357"
    let someNumb = Int(stringNumb as String) // 1357 as integer

Typ 2: Wenn der String nur eine Ganzzahl hat

    let stringNumb = "1357"
    let someNumb = Int(stringNumb) // 1357 as integer

Typ 3: Wenn der String einen Float-Wert hat

    let stringNumb = "13.57"
    if let stringToFloat = Float(stringNumb){
        let someNumb = Int(stringToFloat)// 13 as Integer
    }else{
       //do something if the stringNumb not have digit only. (i.e.,) let stringNumb = "13er4"
    }

Der Code für "Typ 3" ist nicht ideal. Anstatt stringToFloatis zu überprüfen != nil, sollten Sie verwenden if let.
rmaddy

11

Die Methode, die Sie wollen, ist toInt()- Sie müssen ein wenig vorsichtig sein, da die toInt()ein optionales Int zurückgibt.

let stringNumber = "1234"
let numberFromString = stringNumber.toInt()
// numberFromString is of type Int? with value 1234

let notANumber = "Uh oh"
let wontBeANumber = notANumber.toInt()
// wontBeANumber is of type Int? with value nil

aber ähnlich toInt()ist der richtige Weg, es zu tun. Optionals sind ein zentraler Bestandteil der Sprache
Jiaaro

Natürlich müssen Sie sich nur bewusst sein, dass Sie mit einem optionalen, nicht einem direkten Int arbeiten.
Nate Cook

5

Wenn Sie NSStringnur eine verwenden können.

Es ist ziemlich ähnlich zu Objective-C. Alle sind der Datentyp es aber erfordern die as NSStringZugabe

    var x = "400.0" as NSString 

    x.floatValue //string to float
    x.doubleValue // to double
    x.boolValue // to bool
    x.integerValue // to integer
    x.intValue // to int

Außerdem wurde eine toInt()Funktion hinzugefügt. Siehe Apple Inc. "The Swift Programming Language". iBooks. https://itun.es/us/jEUH0.l Seite 49

x.toInt()

habe vergessen das hinzuzufügen as NSString. behoben es @gwcoffey
John Riselvato

2
Ich möchte NSString nicht verwenden, siehe Frage.
Logan

4

Die obige Antwort hat mir nicht geholfen, da mein Zeichenfolgenwert "700.00" war.

mit Swift 2.2 funktioniert das bei mir

let myString = "700.00"
let myInt = (myString as NSString).integerValue

Ich habe myInt an NSFormatterClass übergeben

let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.maximumFractionDigits = 0

let priceValue = formatter.stringFromNumber(myInt!)!

//Now priceValue is700

Danke an diesen Blogbeitrag.


1
Bei dieser Frage geht es darum, eine Ganzzahl aus einem String zu erhalten. In Ihrem Fall haben Sie kein Int, Sie haben ein Double. Verwenden Sie in Swift genau Double()so, wie wir es verwenden Int(). Keine Überbrückung zu NSString erforderlich.
Eric Aya

Hey @EricD, danke für deinen Vorschlag, aber " Ich wollte Integer nur, wenn ich Int an die NSNumberFormatter-Klasse für den Währungsumrechner übergebe."
SwiftBoy

1
Nun, in diesem Fall können Sie Double() dann verwenden Int(). So: if let d = Double("700.00") { let i = Int(d); print (i) }:)
Eric Aya

2

Sie können von String zu NSString überbrücken und von CInt zu Int wie folgt konvertieren:

var myint: Int = Int(stringNumb.bridgeToObjectiveC().intValue)

1

Zu diesem Zweck habe ich eine Erweiterung geschrieben. Es wird immer ein zurückgegeben Int. Wenn die Zeichenfolge nicht in eine passt Int, wird 0 zurückgegeben.

extension String {
    func toTypeSafeInt() -> Int {
        if let safeInt = self.toInt() {
            return safeInt
        } else {
            return 0
        }
    }
}

2
Dies kann prägnanter geschrieben werden als return self.toInt() ?? 0. Es ist wahrscheinlich besser, es einfach so inline zu schreiben, als eine Erweiterungsmethode dafür zu haben.
jlong64

0

Eine allgemeinere Lösung könnte eine Erweiterung sein

extension String {
    var toFloat:Float {
        return Float(self.bridgeToObjectiveC().floatValue)
    }
    var toDouble:Double {
        ....
    }
    ....
}

Dies erweitert beispielsweise das schnelle native String-Objekt um toFloat


0

String in Int 2.0 in Int konvertieren:

var str:NSString = Data as! NSString
var cont:Int = str.integerValue

verwenden .intergerValue or intValue for Int32


0

8: 1 Gewinnchancen (*)

var stringNumb: String = "1357"
var someNumb = Int(stringNumb)

oder

var stringNumb: String = "1357"
var someNumb:Int? = Int(stringNumb)

Int(String)gibt ein optionales zurück Int?, kein Int.


Sichere Verwendung: Nicht explizit auspacken

let unwrapped:Int = Int(stringNumb) ?? 0

oder

if let stringNumb:Int = stringNumb { ... }

(*) Keine der Antworten bezog sich tatsächlich darauf, warum var someNumb: Int = Int(stringNumb)nicht funktionierte.


Vielen Dank an user3441734. Ich hätte kein Casting verwenden sollen .
SwiftArchitect

0

Einfach aber schmutzig

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

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

Der Verlängerungsweg

Das ist wirklich besser, weil es gut mit Gebietsschemas und Dezimalstellen funktioniert.

extension String {

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

Jetzt können Sie einfach tun:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.