Konvertieren von Zeichenfolgen in Int mit Swift


352

Die Anwendung berechnet die Beschleunigung im Wesentlichen durch Eingabe der Anfangs- und Endgeschwindigkeit und -zeit und verwendet dann eine Formel zur Berechnung der Beschleunigung. Da die Werte in den Textfeldern jedoch Zeichenfolgen sind, kann ich sie nicht in Ganzzahlen konvertieren.

@IBOutlet var txtBox1 : UITextField
@IBOutlet var txtBox2 : UITextField
@IBOutlet var txtBox3 : UITextField
@IBOutlet var lblAnswer : UILabel


@IBAction func btn1(sender : AnyObject) {

    let answer1 = "The acceleration is"
    var answer2 = txtBox1
    var answer3 = txtBox2
    var answer4 = txtBox3

7
Ich habe es nicht versucht, aber vielleicht könnten Sie die Werte wievar answer1 = Int(txtBox1.text)
Daniel

Wenn Sie als Zeichenfolge "23.0" annehmen, wird bei Umwandlung in Int ("23.0") null zurückgegeben. In diesem Fall müssen Sie zuerst in Double / Float und dann erneut in Int umwandeln.
Ariven Nadar

Antworten:


326

Grundlegende Idee: Beachten Sie, dass dies nur in Swift 1.x funktioniert ( lesen Sie die Antwort von ParaSara, um zu sehen, wie es in Swift 2.x funktioniert):

    // toInt returns optional that's why we used a:Int?
    let a:Int? = firstText.text.toInt() // firstText is UITextField
    let b:Int? = secondText.text.toInt() // secondText is UITextField

    // check a and b before unwrapping using !
    if a && b {
        var ans = a! + b!
        answerLabel.text = "Answer is \(ans)" // answerLabel ie UILabel
    } else {
        answerLabel.text = "Input values are not numeric"
    }

Update für Swift 4

...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...

Danke das funktioniert. Ich habe jedoch ein Problem, da ich möchte, dass die Zahlen auch Floats enthalten. Danke noch einmal.
Marwan Qasem

4
Wenn Sie Floats benötigen (und Sie wirklich wirklich Double wollen, nicht Float), wird toInt () dies nicht tun. Könnten Sie Ihre Fantasie und die verfügbare Dokumentation nutzen, um eine geeignete Funktion zu finden?
Gnasher729

4
Ich verstehe 'NSString' does not have a member named 'toInt'. Irgendwelche Ideen?
Matej

1
NSStringund Stringsind zwei verschiedene Objekte und haben unterschiedliche Methoden. NSStringhat eine Methode namens.intValue
Byron Coetsee

7
Diese Lösung war nur für Swift und nicht für Swift2 geeignet. Jetzt sollten Sie verwenden: Int (firstText.text)
gurehbgui

337

Update Antwort für Swift 2.0 :

toInt()Methode wird ein Fehler gegeben. In Swift 2.x wurde die .toInt()Funktion aus String entfernt. Als Ersatz hat Int jetzt einen Initialisierer, der einen String akzeptiert:

let a:Int? = Int(firstText.text)     // firstText is UITextField  
let b:Int? = Int(secondText.text)   // secondText is UITextField

Kann ich fragen, warum ich einen Fehler erhalte, wenn ich das 'weglasse?' verkohlen? Warum muss ich 'a' als optional angeben?
Manos Serifios

1
@ ManosSerifios diese Diskussion kann hilfreich sein: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal

nicht wirklich verwandt, aber der Konstruktoransatz wird für Int to Strings immer bevorzugt und ist besser lesbar. "\(someInt)"ist nicht gut String(someInt)ist viel einfacher zu lesen
Honey

Ich drucke Int(firstText.text)!und sehe dann immer noch optional. Warum? Habe ich es nicht ausgepackt?
Honig

Dies wird abstürzen, wenn die Zeichenfolge ist nil. Kann nicht passieren, wenn die Zeichenfolge wie in diesem Fall von einem UI-Element stammt. Eine Möglichkeit, den Absturz zu verhindern, besteht darin, der Zeichenfolge einen Standardwert hinzuzufügen : let a:Int? = Int(firstText.text ?? "").
Jens

85

myString.toInt() - Konvertieren Sie den Zeichenfolgenwert in int.

Swift 3.x.

Wenn sich in einer Zeichenfolge eine Ganzzahl versteckt, können Sie diese mithilfe des Konstruktors der Ganzzahl wie folgt konvertieren:

let myInt = Int(textField.text)

Wie bei anderen Datentypen (Float und Double) können Sie auch mit NSString konvertieren:

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

1
Dies beantwortet tatsächlich die Frage, alle anderen sagen dem OP, wie man eine Ganzzahl als String
ausrollt,

1
Beispiel für Swift 3?
Peter Kreinz

Bitte klären Sie "neueste Swift-Versionen" für den erhofften Mangel an Verwirrung der Nachwelt :)
Alex Hall

@aremvee meinst du eine ganze Zahl als String "umwandeln"? Und was genau macht das, um die Frage zu beantworten, die die anderen Antworten nicht beantworten?
Alex Hall

31

Bearbeiten / Aktualisieren: Xcode 11.4 • Swift 5.2

Bitte überprüfen Sie die Kommentare durch den Code


Inhalt der IntegerField.swift- Datei:

import UIKit

class IntegerField: UITextField {

    // returns the textfield contents, removes non digit characters and converts the result to an integer value
    var value: Int { string.digits.integer ?? 0 }

    var maxValue: Int = 999_999_999
    private var lastValue: Int = 0

    override func willMove(toSuperview newSuperview: UIView?) {
        // adds a target to the textfield to monitor when the text changes
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        // sets the keyboard type to digits only
        keyboardType = .numberPad
        // set the text alignment to right
        textAlignment = .right
        // sends an editingChanged action to force the textfield to be updated
        sendActions(for: .editingChanged)
    }
    // deletes the last digit of the text field
    override func deleteBackward() {
        // note that the field text property default value is an empty string so force unwrap its value is safe
        // note also that collection remove at requires a non empty collection which is true as well in this case so no need to check if the collection is not empty.
        text!.remove(at: text!.index(before: text!.endIndex))
        // sends an editingChanged action to force the textfield to be updated
        sendActions(for: .editingChanged)
    }
    @objc func editingChanged() {
        guard value <= maxValue else {
            text = Formatter.decimal.string(for: lastValue)
            return
        }
        // This will format the textfield respecting the user device locale and settings
        text = Formatter.decimal.string(for: value)
        print("Value:", value)
        lastValue = value
    }
}

Sie müssten diese Erweiterungen auch zu Ihrem Projekt hinzufügen:


Erweiterungen Inhalt der UITextField.swift- Datei:

import UIKit
extension UITextField {
    var string: String { text ?? "" }
}

Erweiterungen Inhalt der Datei Formatter.swift:

import Foundation
extension Formatter {
    static let decimal = NumberFormatter(numberStyle: .decimal)
}

Erweiterungen NumberFormatter.swift- Dateiinhalt:

import Foundation
extension NumberFormatter {
    convenience init(numberStyle: Style) {
        self.init()
        self.numberStyle = numberStyle
    }
}

Erweiterungen StringProtocol.swift- Dateiinhalt:

extension StringProtocol where Self: RangeReplaceableCollection {
    var digits: Self { filter(\.isWholeNumber) }
    var integer: Int? { Int(self) }
}

Beispielprojekt


27

Sie können verwenden NSNumberFormatter().numberFromString(yourNumberString). Es ist großartig, weil es ein optionales Element zurückgibt, mit dem Sie dann testen können if let, ob die Konvertierung erfolgreich war. z.B.

var myString = "\(10)"
if let myNumber = NSNumberFormatter().numberFromString(myString) {
    var myInt = myNumber.integerValue
    // do what you need to do with myInt
} else {
    // what ever error code you need to write
}

Swift 5

var myString = "\(10)"
if let myNumber = NumberFormatter().number(from: myString) {
    var myInt = myNumber.intValue
    // do what you need to do with myInt
  } else {
    // what ever error code you need to write
  }

1
Ich habe es gerade in 'myNumber.integerValue' geändert, da Xcode 7 nicht mit 'intValue' erstellt wird. Letzteres ist von Int32-Wert
Brainray

21

schnell 4.0

let stringNumber = "123"
let number = Int(stringNumber) //here number is of type "Int?"


//using Forced Unwrapping

if number != nil {         
 //string is converted to Int
}

Sie können auch eine andere optionale Bindung als die erzwungene Bindung verwenden.

z.B:

  if let number = Int(stringNumber) { 
   // number is of type Int 
  }

14

// Xcode 8.1 und Swift 3.0

Wir können es auch durch optionale Bindung einfach handhaben

let occur = "10"

if let occ = Int(occur) {
        print("By optional binding :", occ*2) // 20

    }

11

In Swift 4.2 und Xcode 10.1

let string:String = "789"
let intValue:Int = Int(string)!
print(intValue)

let integerValue:Int = 789
let stringValue:String = String(integerValue)
    //OR
//let stringValue:String = "\(integerValue)"
print(stringValue)

7

Swift 3

Der einfachste und sicherste Weg ist:

@IBOutlet var textFieldA  : UITextField
@IBOutlet var textFieldB  : UITextField
@IBOutlet var answerLabel : UILabel

@IBAction func calculate(sender : AnyObject) {

      if let intValueA = Int(textFieldA),
            let intValueB = Int(textFieldB) {
            let result = intValueA + intValueB
            answerLabel.text = "The acceleration is \(result)"
      }
      else {
             answerLabel.text = "The value \(intValueA) and/or \(intValueB) are not a valid integer value"
      }        
}

Vermeiden Sie ungültige Werte, indem Sie den Tastaturtyp auf den Nummernblock setzen:

 textFieldA.keyboardType = .numberPad
 textFieldB.keyboardType = .numberPad

7

In Swift 4:

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

4

Ich habe ein einfaches Programm erstellt, in dem Sie 2 txt-Felder haben, die Sie vom Benutzer eingeben und hinzufügen, um das Verständnis zu vereinfachen. Bitte finden Sie den folgenden Code.

@IBOutlet weak var result: UILabel!
@IBOutlet weak var one: UITextField!
@IBOutlet weak var two: UITextField!

@IBAction func add(sender: AnyObject) {        
    let count = Int(one.text!)
    let cal = Int(two.text!)
    let sum = count! + cal!
    result.text = "Sum is \(sum)"
}

hoffe das hilft.


4

Swift 3.0

Versuchen Sie dies, Sie müssen nicht nach Bedingungen suchen, bei denen ich alles getan habe. Verwenden Sie einfach diese Funktion. Senden Sie alles String, Nummer, Float, Double, etc. Sie erhalten eine Zahl als Wert oder 0, wenn Ihr Wert nicht konvertiert werden kann

Funktion:

func getNumber(number: Any?) -> NSNumber {
    guard let statusNumber:NSNumber = number as? NSNumber else
    {
        guard let statString:String = number as? String else
        {
            return 0
        }
        if let myInteger = Int(statString)
        {
            return NSNumber(value:myInteger)
        }
        else{
            return 0
        }
    }
    return statusNumber
}

Verwendung: Fügen Sie die obige Funktion in den Code ein und konvertieren Sie die Verwendung, let myNumber = getNumber(number: myString) wenn die myStringeine Zahl oder Zeichenfolge hat, die zurückgegebene Nummer0

Beispiel 1:

let number:String = "9834"
print("printing number \(getNumber(number: number))")

Ausgabe: printing number 9834

Beispiel 2:

let number:Double = 9834
print("printing number \(getNumber(number: number))")

Ausgabe: printing number 9834

Beispiel 3:

let number = 9834
print("printing number \(getNumber(number: number))")

Ausgabe: printing number 9834


4

Nützlich für String to Int und andere Typen

extension String {
        //Converts String to Int
        public func toInt() -> Int? {
            if let num = NumberFormatter().number(from: self) {
                return num.intValue
            } else {
                return nil
            }
        }

        //Converts String to Double
        public func toDouble() -> Double? {
            if let num = NumberFormatter().number(from: self) {
                return num.doubleValue
            } else {
                return nil
            }
        }

        /// EZSE: Converts String to Float
        public func toFloat() -> Float? {
            if let num = NumberFormatter().number(from: self) {
                return num.floatValue
            } else {
                return nil
            }
        }

        //Converts String to Bool
        public func toBool() -> Bool? {
            return (self as NSString).boolValue
        }
    }

Verwenden Sie es wie:

"123".toInt() // 123

3

Informationen zu int () und Swift 2.x: Wenn Sie nach der Konvertierung einen Nullwert erhalten, überprüfen Sie, ob Sie versuchen, eine Zeichenfolge mit einer großen Zahl (z. B. 1073741824) zu konvertieren. In diesem Fall versuchen Sie Folgendes:

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
Vielen Dank, dass dies für meinen Fall funktioniert hat. Int () arbeitete für mich mit 16-stelligen Zahlen, begann aber kürzlich zu scheitern.
Ryan Boyd

3

Neueste swift3 dieser Code ist einfach, um Zeichenfolge in int zu konvertieren

let myString = "556"
let myInt = Int(myString)

2

Da eine Zeichenfolge möglicherweise nicht numerische Zeichen enthält, sollten Sie a verwenden guard, um die Operation zu schützen. Beispiel:

guard let labelInt:Int = Int(labelString) else {
    return
}

useLabelInt()

2

Ich habe vor kurzem das gleiche Problem bekommen. Die folgende Lösung ist Arbeit für mich:

        let strValue = "123"
        let result = (strValue as NSString).integerValue

1

Benutze das:

// get the values from text boxes
    let a:Double = firstText.text.bridgeToObjectiveC().doubleValue
    let b:Double = secondText.text.bridgeToObjectiveC().doubleValue

//  we checking against 0.0, because above function return 0.0 if it gets failed to convert
    if (a != 0.0) && (b != 0.0) {
        var ans = a + b
        answerLabel.text = "Answer is \(ans)"
    } else {
        answerLabel.text = "Input values are not numberic"
    }

ODER

Erstellen Sie Ihren UITextField KeyboardType als DecimalTab aus Ihrem XIB oder Storyboard und entfernen Sie alle if-Bedingungen für die Durchführung von Berechnungen, z.

var ans = a + b
answerLabel.text = "Answer is \(ans)"

Da der Tastaturtyp DecimalPad ist, besteht keine Möglichkeit, andere 0-9 oder einzugeben.

Ich hoffe das hilft !!


1
//  To convert user input (i.e string) to int for calculation.I did this , and it works.


    let num:Int? = Int(firstTextField.text!);

    let sum:Int = num!-2

    print(sum);

1

Das funktioniert bei mir

var a:Int? = Int(userInput.text!)

Wie unterscheidet sich das von der im Kommentar angegebenen Lösung?
Beschneiden Sie den

2
Die im Kommentar angegebene Lösung fehlt "!" am Ende, was in Swift 2 und danach erwartet wird
Naishta

1

für Swift3.x

extension String {
    func toInt(defaultValue: Int) -> Int {
        if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
            return n
        } else {
            return defaultValue
        }
    }
}

0

für alternative Lösung. Sie können die Erweiterung eines nativen Typs verwenden. Sie können mit Spielplatz testen.

extension String {
    func add(a: Int) -> Int? {
        if let b = Int(self) {
            return b + a
        }
        else {
            return nil
        }
    }     
}

"2" .add (1)


0

Meine Lösung besteht darin, eine allgemeine Erweiterung für die Konvertierung von Zeichenfolgen in int zu haben.

extension String {

 // default: it is a number suitable for your project if the string is not an integer

    func toInt(default: Int) -> Int {
        if let result = Int(self) {
            return result
        }
        else {
            return default  
        }
    }

}

0
@IBAction func calculateAclr(_ sender: Any) {
    if let addition = addition(arrayString: [txtBox1.text, txtBox2.text, txtBox3.text]) {
      print("Answer = \(addition)")
      lblAnswer.text = "\(addition)"
    }
}

func addition(arrayString: [Any?]) -> Int? {

    var answer:Int?
    for arrayElement in arrayString {
        if let stringValue = arrayElement, let intValue = Int(stringValue)  {
            answer = (answer ?? 0) + intValue
        }
    }

    return answer
}

0

Frage: Die Zeichenfolge "4.0000" kann mit Int ("4.000") nicht in eine Ganzzahl konvertiert werden.

Antwort: Int () prüft, ob die Zeichenfolge eine Ganzzahl ist oder nicht, wenn ja, geben Sie eine Ganzzahl und ansonsten Null an. Float oder Double können jedoch eine beliebige Zeichenfolge in Float oder Double konvertieren, ohne Null zu geben. Beispiel: Wenn Sie eine Ganzzahlzeichenfolge "45" haben, Float ("45") jedoch einen Float-Wert von 45,0 ergibt oder Double ("4567") 45,0 ergibt.

Lösung: NSString (Zeichenfolge: "45.000"). IntegerValue oder Int (Float ("45.000")!)! um das richtige Ergebnis zu erhalten.


0

Ein Int in Swift enthält einen Initialisierer, der einen String akzeptiert. Es wird ein optionales Int? da die Konvertierung fehlschlagen kann, wenn die Zeichenfolge keine Zahl enthält.

Mit einer if let-Anweisung können Sie überprüfen, ob die Konvertierung erfolgreich war.

Ihr Code wird also ungefähr so:

@IBOutlet var txtBox1 : UITextField
@IBOutlet var txtBox2 : UITextField
@IBOutlet var txtBox3 : UITextField
@IBOutlet var lblAnswer : UILabel

@IBAction func btn1(sender : AnyObject) {

    let answer1 = "The acceleration is"
    var answer2 = txtBox1
    var answer3 = txtBox2
    var answer4 = txtBox3

    if let intAnswer = Int(txtBox1.text) {
      // Correctly converted
    }
}

0

Swift 5.0 und höher

Arbeiten

Wenn Sie das teilen String, werden zwei substringsund nicht zwei erstellt Strings. Diese unten Methode wird für überprüfen Anyund wandeln es t0 ist NSNumberes einfach ein konvertieren NSNumberzu Int, Floatwas auch immer Sie benötigen , um Daten eingeben.

Tatsächlicher Code

//Convert Any To Number Object Removing Optional Key Word.
public func getNumber(number: Any) -> NSNumber{
 guard let statusNumber:NSNumber = number as? NSNumber  else {
    guard let statString:String = number as? String else {
        guard let statSubStr : Substring = number as? Substring else {
            return 0
        }
        if let myInteger = Int(statSubStr) {
            return NSNumber(value:myInteger)
        }
        else{
            return 0
        }
    }

    if let myInteger = Int(statString) {
        return NSNumber(value:myInteger)
    }
    else if let myFloat = Float(statString) {
        return NSNumber(value:myFloat)
    }else {
        return 0
    }
}
return statusNumber }

Verwendungszweck

if let hourVal = getNumber(number: hourStr) as? Int {

}

Übergeben String, um zu überprüfen und zu konvertierenDouble

Double(getNumber(number:  dict["OUT"] ?? 0)

0

Swift5 float oder int string to int:

extension String {
    func convertStringToInt() -> Int {
        return Int(Double(self) ?? 0.0)
    }
}

let doubleStr = "4.2"
// print 4
print(doubleStr.convertStringToInt())

let intStr = "4"
// print 4
print(intStr.convertStringToInt())

-1

Ab Swift 3 muss ich mein #% @ erzwingen! string & int mit einem "!" sonst funktioniert es einfach nicht.

Zum Beispiel:

let prefs = UserDefaults.standard
var counter: String!
counter = prefs.string(forKey:"counter")
print("counter: \(counter!)")


var counterInt = Int(counter!)
counterInt = counterInt! + 1
print("counterInt: \(counterInt!)")

OUTPUT:
counter: 1
counterInt: 2

Kannst du nicht einfach tun var counterInt = counter.map { Int($0) }? Wo countersollte ein seinString?
Martin

@ Martin - Nein? macht es optional und fügt somit das Wort "optional" zur Zählerzeichenfolge hinzu.
Sam B

IMHO sollten Sie nicht zwingen, Ihre Optionen auszupacken. Bevorzugen Sie Verwendung guardund if letAussagen
Martin

-1

Konvertieren Sie den String-Wert in Swift 4 in Integer

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
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.