Conversion de chaîne en Int avec Swift

L'application calcule essentiellement l'accélération en entrant la vitesse initiale et finale et le temps, puis en utilisant une formule pour calculer l'accélération. Cependant, puisque 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
280
demandé sur Moritz 2014-06-09 10:57:11

25 réponses

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
...
225
répondu Narendar Singh Saini 2018-03-07 10:05:02

Réponse de mise à jour pour swift 2.0 :

toInt() la méthode est donnée une erreur. Parce Que, Dans Swift 2.x, la fonction .toInt() a été supprimée de la chaîne. 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
322
répondu Paraneetharan Saravanaperumal 2016-12-02 05:16:41

myString.toInt() - Convertissez 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
74
répondu Kumar KL 2017-07-05 11:41:47

Xcode 8.3.2 • Swift 3.1

class IntegerField: UITextField {
    var integer: Int {
        return string.digits.integer
    }
    override func willMove(toSuperview newSuperview: UIView?) {
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        keyboardType = .numberPad
        textAlignment = .right
        editingChanged()
    }
    func editingChanged() {
        text = Formatter.decimal.string(for: integer)
        print(integer)
    }
}

Extensions, structures et initialiseurs requis:

extension Sequence where Iterator.Element == UnicodeScalar {
    var string: String { return String(String.UnicodeScalarView(self)) }
}

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

extension UITextField {
    var string: String { return text ?? "" }
}

extension String {
    private static var digitsPattern = UnicodeScalar("0")..."9"
    var digits: String {
        return unicodeScalars.filter { String.digitsPattern ~= $0 }.string
    }
    var integer: Int { return Int(self) ?? 0 }
}

extension NumberFormatter {
    convenience init(numberStyle: Style) {
        self.init()
        self.numberStyle = numberStyle
    }
}
29
répondu Leo Dabus 2017-10-23 17:56:36

Vous voulez utiliser NSNumberFormatter().numberFromString(yourNumberString). C'est génial car il renvoie un optionnel que vous pouvez ensuite tester avec un "if let" pour 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
     }
22
répondu Abaho Katabarwa 2015-06-09 11:38:10

//Xcode 8.1 et swift 3.0

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

let occur = "10"

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

    }
14
répondu Pankaj Nigam 2017-05-25 14:33:42

Swift 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 une liaison facultative autre que la liaison forcée.

Par exemple:

  if let number = Int(stringNumber) { 
   // number is of type Int 
  }
14
répondu OOMMEN 2017-12-12 12:32:33

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 en définissant le type de clavier sur le pavé numérique:

 textFieldA.keyboardType = .numberPad
 textFieldB.keyboardType = .numberPad
7
répondu torcelly 2017-03-14 04:37:09

Dans Swift 4:

extension String {            
    var numberValue:NSNumber? {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter.number(from: self)
    }
}
let someFloat = "12".numberValue
5
répondu Ankit garg 2017-10-30 06:11:21

J'ai fait un programme simple, où vous avez 2 champs txt vous prenez l'entrée de l'utilisateur et les ajoutez 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 aide.

4
répondu AliRaza Qureshi 2016-01-11 18:11:44

À 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)!
3
répondu Alessandro Ornano 2015-10-30 18:34:04

Dernière swift3 ce code est simplement de convertir la chaîne en int

let myString = "556"
let myInt = Int(myString)
3
répondu shim 2017-05-14 05:40:30

Swift 3.0

Essayez ceci, vous n'avez pas besoin de vérifier toute condition que j'ai tout fait il suffit d'utiliser cette fonction. Envoyer quoi que ce soit de la chaîne, nombre, float, double ,etc,. Vous obtenez un nombre en tant que valeur ou 0 s'il est incapable de convertir votre valeur

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: Ajouter la fonction ci-dessus dans le code et à convertir utiliser let myNumber = getNumber(number: myString) si le myString a un nombre ou une chaîne, il renvoie le nombre sinon il renvoie 0

Exemple 1:

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

Sortie: printing number 9834

Exemple 2:

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

Sortie: printing number 9834

Exemple 3:

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

Sortie: printing number 9834

3
répondu Koushik 2017-11-07 06:34:16

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 de votre UITextField KeyboardType comme DecimalTab à partir de votre XIB ou storyboard, et supprimez toute condition if pour effectuer 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 .

Espérons que cette aide !!

1
répondu Narendar Singh Saini 2014-06-13 10:03:07
//  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
répondu Jenny 2015-11-21 10:43:41

Cela fonctionne pour moi

var a:Int? = Int(userInput.text!)
1
répondu Naishta 2016-12-02 05:14:05

Pour Swift3.x

extension String {
    func toInt(defaultValue: Int) -> Int {
        if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
            return n
        } else {
            return defaultValue
        }
    }
}
1
répondu User9527 2017-04-28 13:02:52

Comme une chaîne peut contenir des caractères non numériques, vous devez utiliser un guard pour protéger l'opération. Exemple:

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

useLabelInt()
1
répondu RonTLV 2018-02-22 08:38:30

Dans Swift 2.x, le .toInt() la fonction a été supprimée de la chaîne. En remplacement, Int a maintenant un initialiseur qui accepte une chaîne

Int (myString)

Dans votre cas, vous pouvez utiliser Int (textField.le texte!) place du champ de texte.le texte!.toInt ()

Swift 1.x

let myString: String = "256"
let myInt: Int? = myString.toInt()

Swift 2.x, 3.x

let myString: String = "256"
let myInt: Int? = Int(myString)
1
répondu Azarmanesh 2018-03-16 07:32:24

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".ajouter(1)

0
répondu Durul Dalkanat 2016-04-09 16:12:07

Ma solution est d'avoir une extension générale pour la conversion string en int.

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
répondu flame3 2017-01-04 11:44:19
@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
répondu Krunal 2017-07-24 09:59:16

À partir de swift 3 , je dois forcer mon #%@! chaîne & int avec un "!"sinon, cela ne fonctionne tout simplement 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
0
répondu Sam B 2017-10-16 21:41:12

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

Réponse: Int () check string est entier ou non si oui, alors donnez-vous entier et sinon nil. mais Float ou Double peut convertir n'importe quelle chaîne de nombres 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 float 45.0 ou que L'utilisation de Double ("4567") vous donne 45.0.

Solution: NSString (chaîne: "45.000").integerValue ou Int (Float ("45.000")!)! pour obtenir de bons résultats.

0
répondu Ravi H Malviya 2018-01-04 14:12:50

J'ai récemment eu le même problème. La solution CI-DESSOUS est un travail pour moi:

        let strValue = "123"
        let result = (strValue as NSString).integerValue
0
répondu Nirmalsinh 2018-03-16 18:26:03