Pobierz wartość całkowitą z ciągu w swift

136

Więc mogę to zrobić:

var stringNumb: NSString = "1357"

var someNumb: CInt = stringNumb.intValue

Ale nie mogę znaleźć sposobu, aby to zrobić w / a String. Chciałbym zrobić coś takiego:

var stringNumb: String = "1357"

var someNumb: Int = Int(stringNumb)

To też nie działa:

var someNumbAlt: Int = myString.integerValue
Logan
źródło
1
var someNumb: Int? = Int(stringNumb)lubvar someNumb = Int(stringNumb)
SwiftArchitect

Odpowiedzi:

181

Swift 2.0 możesz zainicjować Integer za pomocą konstruktora

var stringNumber = "1234"
var numberFromString = Int(stringNumber)
Buru
źródło
14
Od wersji Swift 2.0 nie masz już tej toInt()metody jako części String. Więc ten Intkonstruktor jest teraz jedynym sposobem na konwersję ciągów znaków na wartości typu int.
Morgan Wilde,
1
Średnik nie jest konieczny
Sebastian
Czy możesz powiedzieć, jak postępować, jeśli użytkownik wprowadzi liczbę większą niż limit Int64 w polu tekstowym
Khushboo Dhote
1
@Sebastian nie jest frustrujące? :)
Victor
94

Użyłbym:

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

Uwaga toInt():

Jeśli ciąg reprezentuje liczbę całkowitą, która pasuje do liczby Int, zwraca odpowiednią liczbę całkowitą.

CW0007007
źródło
5
To zadziałało, chociaż jeśli wyraźnie zadeklarujesz var, musisz dodać wykrzyknik: var someNumb: Int = stringNumber.toInt()!jak wskazał @NateCook
Logan
Nie deklaruję tego wprost. Kompilator wie, że numberFromString powinien być int, ponieważ jest zainicjowany jako jeden ...
CW0007007
Wiem, że nie jesteś, ale jestem. Aby to zrobić, musiałem dokonać tego dostosowania. Twój kod jest poprawny, wystarczy dodać go jako komentarz.
Logan
Tak, zwraca wartość tylko wtedy, gdy wartość pasuje do Int, jak wskazuje notatka. W przeciwnym razie zwraca nil ...
CW0007007
5
Zamiast umieszczać !na wezwanie, można zadeklarować zmienną jako opcjonalne: someNumb: Int? = stringNumber.toInt(). Wtedy system bezpieczeństwa typu będzie świadomy, że foomoże nie istnieć. Umieszczenie !spowoduje oczywiście zawieszenie się, jeśli ciąg nie może zostać przekonwertowany na liczbę.
gwcoffey
18

W Swift 3.0

Typ 1: Konwertuj NSString na ciąg

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

Typ 2: jeśli ciąg ma tylko liczbę całkowitą

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

Typ 3: jeśli ciąg ma wartość zmiennoprzecinkową

    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
źródło
Kod „Typu 3” nie jest idealny. Zamiast sprawdzać stringToFloatto != nil, powinieneś użyć if let.
rmaddy
11

Metoda, którą chcesz, to toInt()- musisz być trochę ostrożny, ponieważ toInt()zwraca opcjonalną wartość Int.

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
źródło
ale podobnie toInt()jest właściwą drogą, aby to zrobić.
opcje
Oczywiście musisz po prostu mieć świadomość, że pracujesz z opcjonalnym, a nie prostym Int.
Nate Cook
5

Jeśli możesz używać NSStringtylko.

Jest dość podobny do obiektywnego-c. Wszystkie typy danych są dostępne, ale wymagają as NSStringdodania

    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

toInt()Dodaliśmy również funkcję Zobacz Apple Inc. „Swift Programming Language”. iBooks. https://itun.es/us/jEUH0.l strona 49

x.toInt()
John Riselvato
źródło
zapomniałem dodać as NSString. naprawiono to @gwcoffey
John Riselvato
2
Nie chcę używać NSString, zobacz pytanie.
Logan
4

powyższa odpowiedź nie pomogła mi, ponieważ moja wartość ciągu wynosiła „700,00”

w Swift 2.2 działa to dla mnie

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

Przekazałem myInt do NSFormatterClass

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

let priceValue = formatter.stringFromNumber(myInt!)!

//Now priceValue is ₹ 700

Dzięki temu wpisowi na blogu.

swiftBoy
źródło
1
To pytanie dotyczy uzyskania liczby całkowitej z String. W twoim przypadku nie masz Int, masz Double. W Swift po prostu użyj Double()tego samego sposobu, w jaki używamy Int(). Nie ma potrzeby używania mostkowania do NSString.
Eric Aya
Hej @EricD dzięki za sugestię, ale „ Chciałem Integer tylko wtedy, gdy przekazuję Int do klasy NSNumberFormatter dla przelicznika walut”.
swiftBoy
1
Cóż w tym przypadku możesz użyć, Double() a następnie użyć Int(). W ten sposób: if let d = Double("700.00") { let i = Int(d); print (i) }:)
Eric Aya
2

Możesz mostkować z String do NSString i konwertować z CInt do Int w następujący sposób:

var myint: Int = Int(stringNumb.bridgeToObjectiveC().intValue)
Connor
źródło
1

W tym celu napisałem rozszerzenie. Zawsze zwraca Int. Jeśli ciąg nie mieści się w ciągu Int, zwracane jest 0.

extension String {
    func toTypeSafeInt() -> Int {
        if let safeInt = self.toInt() {
            return safeInt
        } else {
            return 0
        }
    }
}
timo-haas
źródło
2
Można to napisać bardziej zwięźle jako return self.toInt() ?? 0. Prawdopodobnie lepiej jest po prostu napisać to w ten sposób, niż mieć do tego metodę rozszerzającą.
jlong64
0

Bardziej ogólnym rozwiązaniem mogłoby być rozszerzenie

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

to na przykład rozszerza szybki natywny obiekt String o toFloat

loopmasta
źródło
0

Konwertuj ciąg na Int w Swift 2.0:

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

posługiwać się .intergerValue or intValue for Int32

Pablo Ruan
źródło
0

8: 1 kurs (*)

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

lub

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

Int(String)zwraca opcjonalny Int?, a nie Int.


Bezpieczne użytkowanie: nie rozpakowuj w sposób jawny

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

lub

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

(*) Żadna z odpowiedzi w rzeczywistości nie dotyczyła przyczyny var someNumb: Int = Int(stringNumb)niepowodzenia.

SwiftArchitect
źródło
Dziękuję @ user3441734. Nie powinienem był używać castingu .
SwiftArchitect
0

Prosty, ale brudny sposób

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

Sposób rozszerzenia

To jest naprawdę lepsze, ponieważ będzie ładnie grać z ustawieniami narodowymi i dziesiętnymi.

extension String {

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

Teraz możesz po prostu zrobić:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue
Kevin R.
źródło