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

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)

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ą.


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"
    }

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

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

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.


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)

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
        }
    }
}

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


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.