Conversion de String en Int avec Swift


352

L'application calcule essentiellement l'accélération en saisissant la vitesse et le temps initial et final, puis utilise une formule pour calculer l'accélération. Cependant, étant donné que les valeurs dans les zones de texte sont des chaînes, je ne peux pas les convertir en entiers.

@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
Je n'ai pas essayé, mais peut-être pourriez-vous exprimer les valeurs commevar answer1 = Int(txtBox1.text)
Daniel

Si votre chaîne est supposée "23.0", alors si vous la transformez en Int ("23.0"), elle retournera nil, dans ce cas, vous devez d'abord transtyper en Double / Float, puis de nouveau transtyper en Int.
Ariven Nadar

Réponses:


326

Idée de base, notez que cela ne fonctionne que dans Swift 1.x (consultez la réponse de ParaSara pour voir comment cela fonctionne dans Swift 2.x):

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

Mise à jour pour Swift 4

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

Merci ça marche. Cependant, j'ai un problème car je veux que les chiffres incluent également les flottants. Merci encore.
Marwan Qasem

4
Si vous avez besoin de flotteurs (et que vous voulez vraiment vraiment Double, pas flottant), toInt () ne le fera pas. Pourriez-vous utiliser votre imagination et la documentation disponible pour trouver une fonction appropriée?
gnasher729

4
Je comprends 'NSString' does not have a member named 'toInt'. Des idées?
Matej

1
NSStringet Stringsont deux objets différents et ont des méthodes différentes. NSStringa une méthode appelée.intValue
Byron Coetsee

7
Cette solution ne convenait qu'à Swift et non à Swift2. Vous devez maintenant utiliser: Int (firstText.text)
gurehbgui

337

Mise à jour de la réponse pour swift 2.0 :

toInt()la méthode reçoit une erreur. Parce que, dans Swift 2.x, la .toInt()fonction a été supprimée de String. En remplacement, Int a maintenant un initialiseur qui accepte une chaîne:

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

Puis-je demander pourquoi j'obtiens une erreur lorsque j'omet le '?' carboniser? Pourquoi dois-je indiquer «a» en option?
Manos Serifios

1
@ManosSerifios cette discussion peut être utile: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal

pas vraiment lié, mais l'approche constructeur est toujours préférée et plus lisible pour Int to Strings. "\(someInt)"n'est pas bon String(someInt)est beaucoup plus facile à lire
Honey

J'imprime Int(firstText.text)!et puis je vois toujours facultatif. Pourquoi? Ne l'ai-je pas déballé?
Honey

Cela se bloque lorsque la chaîne l'est nil. Peut ne pas se produire lorsque la chaîne provient d'un élément d'interface utilisateur comme dans ce cas. Mais une façon d'éviter que l'accident est d'ajouter une valeur par défaut à la chaîne: let a:Int? = Int(firstText.text ?? "").
Jens

85

myString.toInt() - convertir la valeur de chaîne en int.

Swift 3.x

Si vous avez un entier caché dans une chaîne, vous pouvez convertir en utilisant le constructeur de l'entier, comme ceci:

let myInt = Int(textField.text)

Comme avec d'autres types de données (Float et Double), vous pouvez également convertir en utilisant NSString:

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

1
cela répond en fait à la question, tous les autres disent au PO comment
côtoyer

1
Exemple pour Swift 3?
Peter Kreinz

les pls clarifient "les dernières versions de Swift" pour le manque de confusion espéré de la postérité :)
Alex Hall

@aremvee voulez-vous dire "cast" un entier sous forme de chaîne? Et qu'est-ce que cela fait exactement qui répond à la question que les autres réponses ne font pas?
Alex Hall

31

modifier / mettre à jour: Xcode 11.4 • Swift 5.2

Veuillez vérifier les commentaires via le code


Contenu du fichier IntegerField.swift :

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

Vous devrez également ajouter ces extensions à votre projet:


Extensions du contenu du fichier UITextField.swift :

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

Contenu du fichier Extensions Formatter.swift :

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

Contenu du fichier Extensions NumberFormatter.swift :

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

Contenu du fichier Extensions StringProtocol.swift :

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

Exemple de projet


27

Vous pouvez utiliser NSNumberFormatter().numberFromString(yourNumberString). C'est génial car il renvoie une option que vous pouvez ensuite tester if letpour déterminer si la conversion a réussi. par exemple.

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
Je viens de le changer en «myNumber.integerValue» car Xcode 7 ne sera pas construit avec «intValue». Ce dernier est de valeur Int32
brainray

21

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

vous pouvez également utiliser la liaison facultative autre que la liaison forcée.

par exemple:

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

14

// Xcode 8.1 et swift 3.0

Nous pouvons également le gérer par la liaison facultative, simplement

let occur = "10"

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

    }

11

Dans Swift 4.2 et 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)

Concernant: Int (chaîne)! si la chaîne est nulle, Int? optionnel sera nul et ensuite déballer l'option nil entraînera un crash
jcpennypincher

7

Swift 3

Le moyen le plus simple et le plus sûr est:

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

Évitez les valeurs non valides définissant le type de clavier sur le pavé numérique:

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

7

Dans Swift 4:

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

4

j'ai fait un programme simple, où vous avez 2 champs txt, vous prenez la forme de l'utilisateur et ajoutez-les pour le rendre plus simple à comprendre, veuillez trouver le code ci-dessous.

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

J'espère que cela t'aides.


4

Swift 3.0

Essayez ceci, vous n'avez pas besoin de vérifier la condition. J'ai tout fait, utilisez simplement cette fonction. Envoyez n'importe quoi chaîne, nombre, float, double, etc ,. vous obtenez un nombre sous forme de valeur ou 0 s'il est incapable de convertir votre valeur

Une fonction:

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
}

Utilisation: Ajoutez la fonction ci-dessus dans le code et pour convertir l'utilisation let myNumber = getNumber(number: myString) si elle myStringa un nombre ou une chaîne, elle renvoie le nombre qu'elle renvoie0

Exemple 1:

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

Production: printing number 9834

Exemple 2:

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

Production: printing number 9834

Exemple 3:

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

Production: printing number 9834


4

Utile pour String to Int et autre type

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

Utilisez-le comme:

"123".toInt() // 123

3

À propos de int () et Swift 2.x: si vous obtenez une valeur nulle après la conversion, vérifiez si vous essayez de convertir une chaîne avec un grand nombre (par exemple: 1073741824), dans ce cas, essayez:

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
Merci, cela a fonctionné pour mon cas. Int () fonctionnait pour moi avec des numéros à 16 chiffres mais a récemment commencé à échouer.
Ryan Boyd

3

Dernier swift3 ce code est simplement de convertir la chaîne en int

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

2

Étant donné qu'une chaîne peut contenir des caractères non numériques, vous devez utiliser un guardpour protéger l'opération. Exemple:

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

useLabelInt()

2

J'ai récemment eu le même problème. La solution ci-dessous fonctionne pour moi:

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

1

Utilisez ceci:

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

OU

Faites votre UITextField KeyboardType comme DecimalTab de votre XIB ou storyboard, et supprimez toute condition if pour faire un calcul, c'est-à-dire.

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

Parce que le type de clavier est DecimalPad, il n'y a aucune chance d'entrer d'autres 0-9 ou.

J'espère que cette aide !!


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

Ça marche pour moi

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

En quoi est-ce différent de la solution donnée dans le commentaire?
Prune

2
La solution donnée dans le commentaire manque "!" à la fin, ce qui est attendu dans Swift 2 et au
delà

1

pour Swift3.x

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

0

pour une solution alternative. Vous pouvez utiliser l'extension d'un type natif. Vous pouvez tester avec aire de jeux.

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

"2" .add (1)


0

Ma solution est d'avoir une extension générale pour la conversion de chaîne en entier.

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

Question: la chaîne "4.0000" ne peut pas être convertie en entier en utilisant Int ("4.000")?

Réponse: la chaîne de vérification Int () est entière ou non si oui, alors donnez-vous un entier et sinon nul. mais Float ou Double peut convertir n'importe quelle chaîne numérique en Float ou Double respectif sans donner nil. Exemple si vous avez une chaîne entière "45" mais que l'utilisation de Float ("45") vous donne une valeur flottante de 45,0 ou l'utilisation de Double ("4567") vous donne 45,0.

Solution: NSString (chaîne: "45.000"). IntegerValue ou Int (Float ("45.000")!)! pour obtenir un résultat correct.


0

Un Int dans Swift contient un initialiseur qui accepte une chaîne. Il retourne un Int? Facultatif car la conversion peut échouer si la chaîne ne contient pas de nombre.

En utilisant une instruction if let, vous pouvez valider si la conversion a réussi.

Donc, votre code devient quelque chose comme ceci:

@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 et supérieur

Travail

Dans le cas où vous divisez le, Stringil en crée deux substringset non deux Strings. Cette méthode ci-dessous va vérifier Anyet le convertir en NSNumberson facile à convertir NSNumberen Int, Floatquel que soit le type de données dont vous avez besoin.

Code réel

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

Usage

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

}

Passer Stringpour vérifier et convertir enDouble

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

0

Swift5 float ou 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

Depuis swift 3 , je dois forcer mon #% @! string & int avec un "!" sinon ça ne marche pas.

Par exemple:

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

Tu ne peux pas juste faire var counterInt = counter.map { Int($0) }? Où counterserait unString?
Martin

@Martin - Non? rend son optionnel et ajoute ainsi le mot "optionnel" à la chaîne de compteur.
Sam B

À mon humble avis, vous ne devez pas forcer le déballage de vos options. Préférez l'utilisation guardet les if letdéclarations
Martin

-1

Convertir une valeur de chaîne en entier dans Swift 4

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.