web-dev-qa-db-fra.com

Conversion de chaîne en int avec swift

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, comme les valeurs dans les zones de texte sont des chaînes, je ne parviens pas à les convertir en nombres 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
301
Marwan Qasem

Idée de base, notez que cela ne fonctionne que dans Swift 1.x (consultez 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
...
262

Update Update for Swift 2.0

La méthode toInt() reçoit une erreur. Parce que, dans Swift 2.x, la fonction .toInt() 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

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

Swift 3.x  

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

let myInt = Int(textField.text)

Comme avec les autres types de données (Float et Double), vous pouvez également convertir à l'aide de NSString:

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

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
    }
}
31
Leo Dabus

Vous voulez utiliser NSNumberFormatter().numberFromString(yourNumberString). C’est génial car il renvoie une option 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
Abaho Katabarwa

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 qu'une liaison forcée.

par exemple:

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

// 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
Pankaj Nigam

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

Evitez les valeurs invalides en configurant le type de clavier sur le pavé numérique:

 textFieldA.keyboardType = .numberPad
 textFieldB.keyboardType = .numberPad
7
torcelly

Dans Swift 4:

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

j'ai créé un programme simple dans lequel vous avez 2 champs de texte que vous prenez en entrée de l'utilisateur et que vous ajoutez pour simplifier la compréhension. 

@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
AliRaza Qureshi

Swift 3.0

Essayez ceci, vous n’avez besoin de vérifier aucune condition. J’ai tout fait, utilisez cette fonction. Envoyez n'importe quoi chaîne, numéro, 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: Ajouter la fonction ci-dessus dans le code et convertir utiliser let myNumber = getNumber(number: myString) si la myString a un nombre ou une chaîne, elle retourne le nombre sinon elle retourne 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
Koushik

Latest Swift3 ce code consiste simplement à convertir une chaîne en int

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

À propos de int () et de Swift 2.x: si vous obtenez une valeur nulle après la conversion, cochez 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
Alessandro Ornano

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)
3
iOS

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

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

useLabelInt()
2
RonTLV
//  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
Jenny

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
User9527

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

OR

Créez votre UITextField KeyboardType en tant que DecimalTab à partir de votre XIB ou de votre storyboard, et supprimez toute condition if pour effectuer un calcul, par exemple.

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

Comme le type de clavier est DecimalPad, il n’ya aucune chance de saisir d’autres 0-9 ou.

J'espère que cette aide !!

1

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

Int (myString)

Dans votre cas, vous pouvez utiliser Int (textField.text!) Au lieu de textField.text! .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
Azarmanesh

Ça marche pour moi 

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

Utile pour String to Int et d'autres types

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
0
Viral Savaliya

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

Réponse: La chaîne de vérification Int () est un entier ou pas si oui, alors vous donnez un entier et sinon, nil. 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 de 45,0 float ou que vous utilisez Double ("4567") de 45,0.

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

0
Ravi H Malviya

Ma solution consiste à 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
flame3

Swift 5.0 et supérieur

Travailler

Si vous divisez la String, cela crée deux substrings et non deux Strings. La méthode ci-dessous vérifie la valeur Any et la convertit en NSNumber. Il est facile de convertir une NSNumber en Int, Float quel que soit le type de données dont vous avez besoin.

Code actuel

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

Utilisation

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

}

Passer String pour vérifier et convertir en Double

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

À partir de 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
0
Sam B

pour solution alternative. Vous pouvez utiliser l'extension d'un type natif. Vous pouvez tester avec terrain de jeu. 

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

"2" .add (1)

0
Durul Dalkanat
@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
Krunal

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

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

Donc, votre code devient quelque chose comme ça: 

@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
Patrick

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
Nirmalsinh