Convirtiendo String a Int con Swift

352

La aplicación básicamente calcula la aceleración ingresando la velocidad y el tiempo inicial y final y luego usa una fórmula para calcular la aceleración. Sin embargo, dado que los valores en los cuadros de texto son cadenas, no puedo convertirlos a enteros.

@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
Marwan Qasem
fuente
77
No lo he intentado, pero tal vez podrías emitir los valores comovar answer1 = Int(txtBox1.text)
Daniel
Si su cadena se supone que es "23.0", entonces si la lanza a Int ("23.0") devolverá cero, para este caso primero necesita lanzar a Double / Float y luego nuevamente a Int.
Ariven Nadar

Respuestas:

326

Idea básica, tenga en cuenta que esto solo funciona en Swift 1.x (consulte la respuesta de ParaSara para ver cómo funciona en 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"
    }

Actualización para Swift 4

...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...
Narendar Singh Saini
fuente
Gracias esto funciona. Sin embargo, tengo un problema ya que quiero que los números incluyan flotantes también. Gracias de nuevo.
Marwan Qasem
44
Si necesita flotadores (y realmente quiere Doble, no flotador), toInt () no lo hará. ¿Podrías usar tu imaginación y la documentación disponible para encontrar una función adecuada?
gnasher729
44
Consigo 'NSString' does not have a member named 'toInt'. ¿Algunas ideas?
Matej
1
NSStringy Stringson dos objetos diferentes y tienen diferentes métodos. NSStringtiene un método llamado.intValue
Byron Coetsee
77
Esta solución solo era adecuada para Swift y no para Swift2. Ahora debe usar: Int (firstText.text)
gurehbgui
337

Respuesta de actualización para swift 2.0 :

toInt()El método recibe un error. Porque, en Swift 2.x, la .toInt()función se eliminó de String. En reemplazo, Int ahora tiene un inicializador que acepta una cadena:

let a:Int? = Int(firstText.text)     // firstText is UITextField  
let b:Int? = Int(secondText.text)   // secondText is UITextField
Paraneetharan Saravanaperumal
fuente
¿Puedo preguntar por qué recibo un error cuando omito el '?' ¿carbonizarse? ¿Por qué debo indicar 'a' como opcional?
Manos Serifios
1
@ManosSerifios esta discusión puede ser útil: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal
no está realmente relacionado pero el enfoque de constructor siempre es preferido y más legible para Int to Strings. "\(someInt)"no es bueno String(someInt)es mucho más fácil de leer
Miel
Estoy imprimiendo Int(firstText.text)!y aún veo opcional. ¿Por qué? ¿No lo he desenvuelto?
Miel
Esto se bloqueará cuando la cadena sea nil. Puede que no ocurra cuando la cadena proviene de un elemento de la interfaz de usuario como en este caso. Pero una manera de prevenir el accidente es añadir un valor por defecto de la cadena: let a:Int? = Int(firstText.text ?? "").
Jens
85

myString.toInt() - convierte el valor de la cadena en int.

Swift 3.x

Si tienes un número entero escondido dentro de una cadena, puedes convertirlo usando el constructor del número entero, así:

let myInt = Int(textField.text)

Al igual que con otros tipos de datos (flotante y doble), también puede convertir mediante NSString:

let myString = "556"
let myInt = (myString as NSString).integerValue
Kumar KL
fuente
1
En realidad, esto responde a la pregunta, todas las demás cuentan la OP cómo costa de un entero como una cadena, que no es lo que estaba pidiendo
aremvee
1
Ejemplo para Swift 3?
Peter Kreinz el
los pls aclaran las "últimas versiones de Swift" por la esperada falta de confusión de la posteridad :)
Alex Hall
@aremvee, ¿quieres decir "lanzar" un entero como una cadena? ¿Y qué hace esto exactamente que responde a la pregunta que las otras respuestas no?
Alex Hall
31

editar / actualizar: Xcode 11.4 • Swift 5.2

Por favor revise los comentarios a través del código


Contenido del archivo 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
    }
}

También necesitará agregar esas extensiones a su proyecto:


Extensiones Contenido del archivo UITextField.swift :

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

Extensiones Contenido del archivo Formatter.swift :

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

Extensiones NumberFormatter.swift contenido del archivo:

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

Extensiones StringProtocol.swift contenido del archivo:

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

Proyecto de muestra

Leo Dabus
fuente
27

Puedes usar NSNumberFormatter().numberFromString(yourNumberString). Es genial porque devuelve un opcional con el que luego puede probar if letpara determinar si la conversión fue exitosa. p.ej.

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
  }
Abaho Katabarwa
fuente
1
Simplemente lo cambié a 'myNumber.integerValue' ya que Xcode 7 no se compilará con 'intValue'. Este último es de valor Int32
brainray
21

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
}

también puede usar el enlace opcional que no sea el enlace forzado.

p.ej:

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

// Xcode 8.1 y swift 3.0

También podemos manejarlo mediante enlace opcional, simplemente

let occur = "10"

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

    }
Pankaj Nigam
fuente
11

En Swift 4.2 y 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)
iOS
fuente
En cuanto a: Int (cadena)! si la cadena es nula, Int? opcional será nulo y luego desenvolver el nulo opcional dará como resultado un bloqueo
jcpennypincher
7

Swift 3

La forma más simple y segura es:

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

Evite valores no válidos configurando el tipo de teclado en el teclado numérico:

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

En Swift 4:

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

Hice un programa simple, donde tiene 2 campos txt, toma la entrada del usuario y los agrega para que sea más fácil de entender, encuentre el código a continuación.

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

espero que esto ayude.

AliRaza Qureshi
fuente
4

Swift 3.0

Pruebe esto, no necesita verificar ninguna condición. He hecho todo, solo use esta función. Envíe cualquier cadena, número, flotante, doble, etc. obtienes un número como valor o 0 si no puede convertir tu valor

Función:

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
}

Uso: Agregue la función anterior en el código y para convertir, use let myNumber = getNumber(number: myString) si myStringtiene un número o una cadena, devuelve el número que devuelve0

Ejemplo 1:

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

Salida: printing number 9834

Ejemplo 2

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

Salida: printing number 9834

Ejemplo 3

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

Salida: printing number 9834

Koushik
fuente
4

Útil para String to Int y otro tipo

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

Úselo como:

"123".toInt() // 123
Savaliya viral
fuente
3

Acerca de int () y Swift 2.x: si obtiene un valor nulo después de la conversión, compruebe si intenta convertir una cadena con un número grande (por ejemplo: 1073741824), en este caso intente:

let bytesInternet : Int64 = Int64(bytesInternetString)!
Alessandro Ornano
fuente
1
Gracias, esto funcionó para mi caso. Int () estaba trabajando para mí con números de 16 dígitos, pero recientemente comenzó a fallar.
Ryan Boyd
3

El último código swift3 es simplemente convertir cadenas a int

let myString = "556"
let myInt = Int(myString)
calce
fuente
2

Debido a que una cadena puede contener caracteres no numéricos, debe usar a guardpara proteger la operación. Ejemplo:

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

useLabelInt()
RonTLV
fuente
2

Recientemente tuve el mismo problema. La siguiente solución es trabajo para mí:

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

Utilizar este:

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

O

Haga su UITextField KeyboardType como DecimalTab desde su XIB o guión gráfico, y elimine cualquier condición para hacer cualquier cálculo, es decir.

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

Debido a que el tipo de teclado es DecimalPad, no hay posibilidad de ingresar otros 0-9 o.

Espero que esto ayude !!

Narendar Singh Saini
fuente
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);
Jenny
fuente
1

Esto funciona para mi

var a:Int? = Int(userInput.text!)
Naishta
fuente
¿Cómo es esto diferente de la solución dada en el comentario?
Poda
2
Falta la solución dada en el comentario "!" al final, que se espera en Swift 2 y en adelante
Naishta
1

para Swift3.x

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

para solución alternativa. Puede usar la extensión de un tipo nativo. Puedes probar con patio de recreo.

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

"2" .add (1)

Durul Dalkanat
fuente
0

Mi solución es tener una extensión general para la conversión de cadenas a 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  
        }
    }

}
flame3
fuente
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
}
Krunal
fuente
0

Pregunta: ¿la cadena "4.0000" no se puede convertir en entero usando Int ("4.000")?

Respuesta: La cadena de verificación Int () es entera o no si es así, entonces le da un número entero y de lo contrario es nulo. pero Float o Double pueden convertir cualquier cadena numérica a Float o Double respectivas sin dar nil. Ejemplo si tiene una cadena entera "45" pero el uso de Float ("45") le da un valor flotante de 45.0 o el uso de Double ("4567") le da 45.0.

Solución: NSString (cadena: "45.000"). IntegerValue o Int (Float ("45.000")!)! para obtener el resultado correcto

Ravi Kumar
fuente
0

Un Int en Swift contiene un inicializador que acepta una Cadena. ¿Devuelve un Int opcional? ya que la conversión puede fallar si la cadena no contiene un número.

Al usar una declaración if let, puede validar si la conversión se realizó correctamente.

Entonces su código se convierte en algo como esto:

@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
    }
}
Patricio
fuente
0

Swift 5.0 y superior

Trabajando

En caso de que esté dividiendo String, crea dos substringsy no dos Strings. Este método continuación comprobará Anyy convertirlo t0 NSNumberes fácil convertir un NSNumbera Int, Floatlo que sea el tipo de datos que necesita.

Código actual

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

Uso

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

}

Pasando Stringpara verificar y convertir aDouble

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

Swift5 float o int string a 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())
fzh
fuente
-1

A partir de swift 3 , ¡tengo que forzar mi #% @! string & int con un "!" de lo contrario, simplemente no funciona.

Por ejemplo:

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
Sam B
fuente
¿No puedes simplemente hacer var counterInt = counter.map { Int($0) }? ¿Dónde counterdebería estar?String?
Martin
@ Martin - ¿No? hace su opcional y por lo tanto agrega la palabra "opcional" a la cadena de contador.
Sam B
En mi humilde opinión, no debe forzar a desenvolver sus opcionales. Prefiero uso guardy if letdeclaraciones
Martin
-1

Convertir valor de cadena a entero en Swift 4

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
Mahesh Chaudhari
fuente