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
Logan
quelle
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)
Buru
quelle
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.

CW0007007
quelle
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"
    }
Rajamohan S.
quelle
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
Nate Cook
quelle
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()
John Riselvato
quelle
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.

swiftBoy
quelle
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)
Connor
quelle
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
        }
    }
}
timo-haas
quelle
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

Loopmasta
quelle
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

Pablo Ruan
quelle
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.

SwiftArchitect
quelle
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
Kevin R.
quelle