Convertendo String para Int com Swift

352

O aplicativo basicamente calcula a aceleração inserindo a velocidade e o tempo inicial e final e, em seguida, usa uma fórmula para calcular a aceleração. No entanto, como os valores nas caixas de texto são string, não consigo convertê-los em números inteiros.

@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
fonte
7
Não tentei, mas talvez você poderia lançar os valores comovar answer1 = Int(txtBox1.text)
Daniel
Se a string for suposta "23.0", se você a converter para Int ("23.0"), ela retornará nula; nesse caso, você precisará converter para Double / Float e depois converter novamente para Int.
Ariven Nadar

Respostas:

326

Idéia básica, observe que isso só funciona no Swift 1.x (confira a resposta do ParaSara para ver como ele funciona no 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"
    }

Atualização para Swift 4

...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...
Narendar Singh Saini
fonte
Graças isso funciona. No entanto, tenho um problema, pois quero que os números incluam flutuadores também. Obrigado novamente.
Marwan Qasem
4
Se você precisar de floats (e realmente quiser Double, não float), o toInt () não fará isso. Você poderia usar sua imaginação e a documentação disponível para encontrar uma função adequada?
gnasher729
4
Eu entendo 'NSString' does not have a member named 'toInt'. Alguma ideia?
Matej
11
NSStringe Stringsão dois objetos diferentes e têm métodos diferentes. NSStringtem um método chamado.intValue
Byron Coetsee
7
Essa solução foi adequada apenas para o Swift e não para o Swift2. Agora você deve usar: Int (firstText.text)
gurehbgui
337

Resposta de atualização para o swift 2.0 :

toInt()O método recebe um erro. Porque, no Swift 2.x, a .toInt()função foi removida da String. Em substituição, o Int agora possui um inicializador que aceita uma String:

let a:Int? = Int(firstText.text)     // firstText is UITextField  
let b:Int? = Int(secondText.text)   // secondText is UITextField
Paraneetharan Saravanaperumal
fonte
Posso perguntar por que estou recebendo um erro quando omito o '?' Caracteres? Por que preciso declarar 'a' como opcional?
Manos Serifios
11
@ManosSerifios que esta discussão pode ser útil: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal
não é realmente relacionado, mas a abordagem do construtor é sempre preferível e mais legível para Int to Strings. "\(someInt)"não é bom String(someInt)é muito mais fácil de ler
Mel
Estou imprimindo Int(firstText.text)!e continuo vendo opcional. Por quê? Eu não o desembrulhei?
Honey
Isso falhará quando a string estiver nil. Pode não acontecer quando a string vem de um elemento da interface do usuário como neste caso. Mas uma maneira de evitar o acidente é adicionar um valor padrão para a cadeia: let a:Int? = Int(firstText.text ?? "").
Jens
85

myString.toInt() - converte o valor da string em int.

Swift 3.x

Se você tiver um número inteiro oculto dentro de uma sequência, poderá converter usando o construtor do número inteiro, assim:

let myInt = Int(textField.text)

Assim como outros tipos de dados (Float e Double), você também pode converter usando o NSString:

let myString = "556"
let myInt = (myString as NSString).integerValue
Kumar KL
fonte
11
isso realmente responde à pergunta, todos os outros dizer o OP como um Integer costa como um String, que não é o que ele estava pedindo
aremvee
11
Exemplo para Swift 3?
22426 Peter Kreinz #
pls esclarecer "as últimas versões Swift" para esperava falta de confusão :) posteridade
Alex Hall
@aremvee, você quer dizer "converter" um número inteiro como uma string? E o que exatamente isso faz, responde à pergunta que as outras respostas não?
Alex Hall
31

edição / atualização: Xcode 11.4 • Swift 5.2

Por favor, verifique os comentários através do código


Conteúdo do arquivo 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
    }
}

Você também precisará adicionar essas extensões ao seu projeto:


Conteúdo do arquivo UITextField.swift das extensões :

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

Conteúdo do arquivo Extensions Formatter.swift :

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

Conteúdo do arquivo NumberFormatter.swift das extensões :

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

Extensões StringProtocol.swift conteúdo do arquivo:

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

Projeto de exemplo

Leo Dabus
fonte
27

Você pode usar NSNumberFormatter().numberFromString(yourNumberString). É ótimo porque retorna um opcional que você pode testar if letpara determinar se a conversão foi bem-sucedida. por exemplo.

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
fonte
11
Eu apenas mudei para 'myNumber.integerValue', pois o Xcode 7 não será construído com 'intValue'. O último é de Int32 valor
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
}

você também pode usar a Ligação opcional, exceto a ligação forçada.

por exemplo:

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

// Xcode 8.1 e swift 3.0

Nós também podemos lidar com isso por Encadernação opcional, Simplesmente

let occur = "10"

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

    }
Pankaj Nigam
fonte
11

No Swift 4.2 e no 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
fonte
Em relação a: Int (string)! se a cadeia for nula, Int? opcional será nulo e, em seguida, desembrulhar o nil opcional resultará em um acidente
jcpennypincher
7

Swift 3

A maneira mais simples e segura é:

@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 inválidos configurando o tipo de teclado como teclado numérico:

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

No Swift 4:

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

Eu criei um programa simples, onde você tem 2 campos txt, você pega o formulário do usuário e os adiciona para facilitar a compreensão, por favor, encontre o código abaixo.

@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 isto ajude.

AliRaza Qureshi
fonte
4

Swift 3.0

Tente isso, você não precisa verificar nenhuma condição. Eu fiz tudo, apenas use esta função. Envie qualquer string, número, número flutuante, duplo, etc. você recebe um número como um valor ou 0 se não conseguir converter seu valor

Função:

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: adicione a função acima no código e converta o uso let myNumber = getNumber(number: myString) se o myStringnúmero ou a string tiver retornado o número que retornar0

Exemplo 1:

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

Resultado: printing number 9834

Exemplo 2:

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

Resultado: printing number 9834

Exemplo 3:

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

Resultado: printing number 9834

Koushik
fonte
4

Útil para String para Int e outro 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
        }
    }

Use-o como:

"123".toInt() // 123
Viral Savaliya
fonte
3

Sobre int () e Swift 2.x: se você receber um valor nulo após a conversão, verifique se tenta converter uma sequência com um número grande (por exemplo: 1073741824), neste caso, tente:

let bytesInternet : Int64 = Int64(bytesInternetString)!
Alessandro Ornano
fonte
11
Obrigado, isso funcionou para o meu caso. Int () estava trabalhando para mim com números de 16 dígitos, mas recentemente começou a falhar.
Ryan Boyd
3

Swift3 mais recente este código é simplesmente para converter string para int

let myString = "556"
let myInt = Int(myString)
calço
fonte
2

Como uma sequência pode conter caracteres não numéricos, você deve usar a guardpara proteger a operação. Exemplo:

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

useLabelInt()
RonTLV
fonte
2

Recentemente, tive o mesmo problema. A solução abaixo é um trabalho para mim:

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

Usa isto:

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

Faça seu UITextField KeyboardType como DecimalTab do seu XIB ou storyboard e remova qualquer condição if para fazer qualquer cálculo, ou seja.

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

Como o tipo de teclado é DecimalPad, não há chance de inserir outros 0-9 ou.

Espero que esta ajuda !!

Narendar Singh Saini
fonte
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
fonte
1

Isso funciona para mim

var a:Int? = Int(userInput.text!)
Naishta
fonte
Como isso é diferente da solução apresentada no comentário?
Prune
2
Falta a solução dada no comentário "!" no final, o que é esperado no Swift 2 em diante
Naishta 22/10/2015
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
fonte
0

para solução alternativa. Você pode usar a extensão de um tipo nativo. Você pode testar com o playground.

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

"2" .add (1)

Durul Dalkanat
fonte
0

Minha solução é ter uma extensão geral para conversão de string para 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
fonte
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
fonte
0

Pergunta: a string "4.0000" não pode ser convertida em número inteiro usando Int ("4.000")?

Resposta: A string de verificação Int () é inteira ou não, se sim, então você fornece inteiro e, caso contrário, nulo. mas Float ou Double pode converter qualquer sequência numérica para o respectivo Float ou Double sem fornecer nada. Exemplo se você tiver uma sequência inteira "45", mas usar Float ("45") fornecer 45,0 para o valor flutuante ou usar Double ("4567") fornecer 45,0.

Solução: NSString (string: "45.000"). IntegerValue ou Int (Float ("45.000")!)! para obter o resultado correto.

Ravi Kumar
fonte
0

Um Int no Swift contém um inicializador que aceita uma String. Retorna um Int opcional? pois a conversão poderá falhar se a sequência não contiver um número.

Usando uma instrução if let, você pode validar se a conversão foi bem-sucedida.

Portanto, seu código se torna algo assim:

@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
    }
}
Patrick
fonte
0

Swift 5.0 e superior

Trabalhando

Caso você esteja dividindo, Stringele cria dois substringse não dois Strings. Este abaixo método irá verificar Anye convertê-lo t0 NSNumberé fácil converter um NSNumberpara Int, Floato que nunca tipo de dados que você precisa.

Código atual

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

}

Passando Stringpara verificar e converter paraDouble

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

Swift5 float ou int string para 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
fonte
-1

Desde o Swift 3 , eu tenho que forçar meu #% @! string & int com um "!" caso contrário, simplesmente não funciona.

Por exemplo:

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
fonte
Você não pode simplesmente fazer var counterInt = counter.map { Int($0) }? Onde counterquer que seja umString?
Martin
@ Martin - Não? torna seu opcional e, assim, adiciona a palavra "opcional" à string do contador.
Sam B
IMHO, você não deve forçar a desembrulhar seus opcionais. Prefira uso guarde if letdeclarações
Martin
-1

Converter valor String em Inteiro no Swift 4

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