Conversione di String in Int con Swift


352

L'applicazione calcola sostanzialmente l'accelerazione immettendo la velocità e il tempo iniziale e finale, quindi usa una formula per calcolare l'accelerazione. Tuttavia, poiché i valori nelle caselle di testo sono stringa, non sono in grado di convertirli in numeri interi.

@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
Non ci ho provato ma forse potresti lanciare valori comevar answer1 = Int(txtBox1.text)
Daniel

Se si suppone che la stringa sia "23.0", quindi se si esegue il cast su Int ("23.0"), verrà restituito zero, per questo caso è necessario prima eseguire il cast su Double / Float e quindi nuovamente su Int.
Ariven Nadar,

Risposte:


326

Idea di base, nota che funziona solo in Swift 1.x (controlla la risposta di ParaSara per vedere come funziona in 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"
    }

Aggiornamento per Swift 4

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

Grazie funziona. Tuttavia, ho un problema poiché voglio che anche i numeri includano i float. Grazie ancora.
Marwan Qasem,

4
Se hai bisogno di float (e vuoi davvero Double, non float), toInt () non lo farà. Potresti usare la tua immaginazione e la documentazione disponibile per trovare una funzione adatta?
gnasher729,

4
Ho capito 'NSString' does not have a member named 'toInt'. Qualche idea?
Matej,

1
NSStringe Stringsono due oggetti diversi e hanno metodi diversi. NSStringha un metodo chiamato.intValue
Byron Coetsee,

7
Questa soluzione era adatta solo a Swift e non a Swift2. Ora dovresti usare: Int (firstText.text)
gurehbgui,

337

Risposta di aggiornamento per swift 2.0 :

toInt()viene dato un errore al metodo Perché, in Swift 2.x, la .toInt()funzione è stata rimossa da String. In sostituzione, Int ora ha un inizializzatore che accetta una stringa:

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

Posso chiedere perché visualizzo un errore quando ometto "?" char? Perché devo indicare "a" come facoltativo?
Manos Serifios,

1
@ManosSerifios questa discussione può essere utile: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal

non veramente correlato ma l'approccio del costruttore è sempre preferito e più leggibile per Int to Strings. "\(someInt)"non va bene String(someInt)è molto più facile da leggere
Honey

Sto stampando Int(firstText.text)!e poi vedo ancora opzionale. Perché? Non l'ho scartato?
Miele,

Questo si arresterà in modo anomalo quando la stringa è nil. Potrebbe non accadere quando la stringa proviene da un elemento dell'interfaccia utente come in questo caso. Ma un modo per evitare che l'incidente è quello di aggiungere un valore predefinito per la stringa: let a:Int? = Int(firstText.text ?? "").
Jens,

85

myString.toInt() - converti il ​​valore della stringa in int.

Swift 3.x

Se hai un numero intero nascosto in una stringa, puoi convertirlo usando il costruttore del numero intero, in questo modo:

let myInt = Int(textField.text)

Come con altri tipi di dati (Float e Double) puoi anche convertire usando NSString:

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

1
questo in realtà risponde alla domanda, tutti gli altri dicono
all'OP come costeggiare

1
Esempio per Swift 3?
Peter Kreinz,

per favore chiarisci "ultime versioni Swift" per la mancanza di confusione dei posteri :)
Alex Hall

@aremvee intendi "cast" un numero intero come stringa? E cosa fa esattamente ciò che risponde alla domanda a cui le altre risposte non fanno?
Alex Hall,

31

modifica / aggiorna: Xcode 11.4 • Swift 5.2

Si prega di controllare i commenti attraverso il codice


Contenuto del file 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
    }
}

Dovresti aggiungere anche quelle estensioni al tuo progetto:


Contenuto del file delle estensioni UITextField.swift :

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

Contenuto del file Extatter Formatter.swift :

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

Contenuto del file Extensions NumberFormatter.swift :

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

Estensioni StringProtocol.swift contenuto del file:

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

Progetto di esempio


27

È possibile utilizzare NSNumberFormatter().numberFromString(yourNumberString). È fantastico perché restituisce un accessorio facoltativo che puoi quindi testare if letper determinare se la conversione ha avuto esito positivo. per esempio.

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
L'ho appena cambiato in 'myNumber.integerValue' poiché Xcode 7 non si costruirà con 'intValue'. Quest'ultimo è di valore Int32
brainray

21

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

è inoltre possibile utilizzare il binding opzionale diverso dal binding forzato.

per esempio:

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

14

// Xcode 8.1 e swift 3.0

Possiamo anche gestirlo tramite binding opzionale, semplicemente

let occur = "10"

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

    }

11

In Swift 4.2 e 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)

Per quanto riguarda: Int (stringa)! se la stringa è nulla, Int? facoltativo sarà nullo e quindi scartandolo, il risultato sarà un incidente
jcpennypincher

7

Swift 3

Il modo più semplice e sicuro è:

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

Evita valori non validi impostando il tipo di tastiera sul tastierino numerico:

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

7

In Swift 4:

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

4

ho creato un programma semplice, in cui hai 2 campi txt, prendi l'input dall'utente e li aggiungi per renderlo più semplice da capire, per favore trova il codice qui sotto.

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

spero che sia di aiuto.


4

Swift 3.0

Prova questo, non è necessario verificare alcuna condizione in cui ho fatto tutto, basta usare questa funzione. Invia qualsiasi stringa, numero, float, double, ecc. ottieni un numero come valore o 0 se non è in grado di convertire il tuo valore

Funzione:

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: aggiungi la funzione sopra nel codice e per convertirla usa let myNumber = getNumber(number: myString) se myStringha un numero o una stringa restituisce il numero altrimenti restituito0

Esempio 1:

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

Produzione: printing number 9834

Esempio 2:

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

Produzione: printing number 9834

Esempio 3:

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

Produzione: printing number 9834


4

Utile per String to Int e altri tipi

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

Usalo come:

"123".toInt() // 123

3

Informazioni su int () e Swift 2.x: se si ottiene un valore nullo dopo la conversione, verificare se si tenta di convertire una stringa con un numero elevato (ad esempio: 1073741824), in questo caso provare:

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
Grazie, ha funzionato per il mio caso. Int () stava lavorando per me con numeri a 16 cifre ma recentemente ha iniziato a fallire.
Ryan Boyd,

3

Swift3 più recente questo codice è semplicemente per convertire la stringa in int

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

2

Poiché una stringa potrebbe contenere caratteri non numerici, è necessario utilizzare a guardper proteggere l'operazione. Esempio:

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

useLabelInt()

2

Recentemente ho avuto lo stesso problema. Di seguito la soluzione è lavoro per me:

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

1

Usa questo:

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

Crea il tuo UITextField KeyboardType come DecimalTab dal tuo XIB o storyboard e rimuovi qualsiasi condizione if per fare qualsiasi calcolo, ad es.

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

Poiché il tipo di tastiera è DecimalPad non è possibile immettere altri 0-9 o.

Spero che questo aiuto !!


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

Questo funziona per me

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

In che cosa differisce dalla soluzione fornita nel commento?
Prugna

2
Manca la soluzione fornita nel commento "!" alla fine, previsto in Swift 2 e
versioni

1

per Swift3.x

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

0

per soluzione alternativa. È possibile utilizzare l'estensione un tipo nativo. Puoi testare con un parco giochi.

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

"2" .add (1)


0

La mia soluzione è avere un'estensione generale per la conversione da stringa 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  
        }
    }

}

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

Domanda: la stringa "4.0000" non può essere convertita in numero intero usando Int ("4.000")?

Risposta: Int () controlla che la stringa sia intera o no se sì allora ti dà un numero intero e altrimenti zero. ma Float o Double possono convertire qualsiasi stringa numerica nel rispettivo Float o Double senza dare zero. Esempio se si dispone di una stringa intera "45" ma l'utilizzo di Float ("45") fornisce un valore float 45.0 o l'uso di Double ("4567") fornisce 45.0.

Soluzione: NSString (stringa: "45.000"). IntegerValue o Int (Float ("45.000")!)! per ottenere il risultato corretto.


0

Un Int in Swift contiene un inizializzatore che accetta una stringa. Restituisce un Int opzionale? poiché la conversione può avere esito negativo se la stringa non contiene un numero.

Utilizzando un'istruzione if let è possibile verificare se la conversione è riuscita.

Quindi il tuo codice diventa qualcosa del genere:

@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 e versioni successive

Lavorando

Nel caso in cui stai dividendo String, crea due substringse non due Strings. Questo metodo seguito verificare la presenza Anye convertirlo t0 NSNumberè facile convertire un NSNumbera Int, Floatche cosa mai tipo dati necessari.

Codice attuale

//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 Stringper verificare e convertire inDouble

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

0

Swift5 float o int string in 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

A partire da Swift 3 , devo forzare il mio #% @! stringa e int con un "!" altrimenti non funziona.

Per esempio:

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

Non puoi farlo var counterInt = counter.map { Int($0) }? Dove counterdovrebbe essere unString?
Martin

@Martin - No.? rende facoltativo e quindi aggiunge la parola "opzionale" alla stringa del contatore.
Sam B,

IMHO, non dovresti forzare a scartare i tuoi optionals. Preferisci l'uso guarde le if letdichiarazioni
Martin,

-1

Converti il ​​valore di stringa in intero in Swift 4

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.