Converting String to Int with Swift

IosSwiftCocoa TouchIntegerUitextfield

Ios Problem Overview


The application basically calculates acceleration by inputting Initial and final velocity and time and then use a formula to calculate acceleration. However, since the values in the text boxes are string, I am unable to convert them to integers.

@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

Ios Solutions


Solution 1 - Ios

Updated answer for Swift 2.0+:

toInt() method gives an error, as it was removed from String in Swift 2.x. Instead, the Int type now has an initializer that accepts a String:

let a: Int? = Int(firstTextField.text)
let b: Int? = Int(secondTextField.text)

Solution 2 - Ios

Basic Idea, note that this only works in Swift 1.x (check out ParaSara's answer to see how it works 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"
    }

Update for Swift 4

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

Solution 3 - Ios

myString.toInt() - convert the string value into int .

Swift 3.x

If you have an integer hiding inside a string, you can convertby using the integer's constructor, like this:

let myInt = Int(textField.text)

As with other data types (Float and Double) you can also convert by using NSString:

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

Solution 4 - Ios

You can use NSNumberFormatter().numberFromString(yourNumberString). It's great because it returns an an optional that you can then test with if let to determine if the conversion was successful. eg.

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
  }

Solution 5 - Ios

edit/update: Xcode 11.4 • Swift 5.2

Please check the comments through the code


IntegerField.swift file contents:

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

You would need to add those extensions to your project as well:


Extensions UITextField.swift file contents:

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

Extensions Formatter.swift file contents:

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

Extensions NumberFormatter.swift file contents:

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

Extensions StringProtocol.swift file contents:

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

Sample project

Solution 6 - Ios

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
}

you could also use Optional Binding other than forced binding.

eg:

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

Solution 7 - Ios

//Xcode 8.1 and swift 3.0

We can also handle it by Optional Binding, Simply

let occur = "10"

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

Solution 8 - Ios

In Swift 4.2 and Xcode 10.1

let string = "789"
if let intValue = Int(string) {
    print(intValue)
}

let integerValue = 789
let stringValue = String(integerValue)

OR

let stringValue = "\(integerValue)"
print(stringValue)

Solution 9 - Ios

Swift 3

The simplest and more secure way is:

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

Avoid invalid values setting keyboard type to number pad:

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

Solution 10 - Ios

In Swift 4:

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

Solution 11 - Ios

Useful for String to Int and other type

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 it like :

"123".toInt() // 123

Solution 12 - Ios

i have made a simple program, where you have 2 txt field you take input form the user and add them to make it simpler to understand please find the code below.

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

hope this helps.

Solution 13 - Ios

Swift 3.0

Try this, you don't need to check for any condition I have done everything just use this function. Send anything string, number, float, double ,etc,. you get a number as a value or 0 if it is unable to convert your value

Function:

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
}

Usage: Add the above function in code and to convert use let myNumber = getNumber(number: myString) if the myString has a number or string it returns the number else it returns 0

Example 1:

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

Output: printing number 9834

Example 2:

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

Output: printing number 9834

Example 3:

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

Output: printing number 9834

Solution 14 - Ios

About int() and Swift 2.x: if you get a nil value after conversion check if you try to convert a string with a big number (for example: 1073741824), in this case try:

let bytesInternet : Int64 = Int64(bytesInternetString)!

Solution 15 - Ios

Latest swift3 this code is simply to convert string to int

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

Solution 16 - Ios

Because a string might contain non-numerical characters you should use a guard to protect the operation. Example:

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

useLabelInt()

Solution 17 - Ios

I recently got the same issue. Below solution is work for me:

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

Solution 18 - Ios

Swift5 float or int string to 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())

Solution 19 - Ios

Use this:

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

Make your UITextField KeyboardType as DecimalTab from your XIB or storyboard, and remove any if condition for doing any calculation, ie.

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

Because keyboard type is DecimalPad there is no chance to enter other 0-9 or .

Hope this help !!

Solution 20 - Ios

This works for me

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

Solution 21 - Ios

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

Solution 22 - Ios

for Swift3.x

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

Solution 23 - Ios

Swift 4, Swift 5

There are different cases to convert from something to something data type, it depends the input.

If the input data type is Any, we have to use as before convert to actual data type, then convert to data type what we want. For example:

func justGetDummyString() -> Any {
  return "2000"
}
let dummyString: String = (justGetDummyString() as? String) ?? "" // output = "2000"
let dummyInt: Int = Int(dummyString) ?? 0 // output = 2000

Solution 24 - Ios

for Alternative solution. You can use extension a native type. You can test with playground.

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

"2".add(1)

Solution 25 - Ios

My solution is to have a general extension for string to int conversion.

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

}

Solution 26 - Ios

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

Solution 27 - Ios

Question : string "4.0000" can not be convert into integer using Int("4.000")?

Answer : Int() check string is integer or not if yes then give you integer and otherwise nil. but Float or Double can convert any number string to respective Float or Double without giving nil. Example if you have "45" integer string but using Float("45") gives you 45.0 float value or using Double("4567") gives you 45.0.

Solution : NSString(string: "45.000").integerValue or Int(Float("45.000")!)! to get correct result.

Solution 28 - Ios

An Int in Swift contains an initializer that accepts a String. It returns an optional Int? as the conversion can fail if the string contains not a number.

By using an if let statement you can validate whether the conversion succeeded.

So your code become something like this:

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

Solution 29 - Ios

Swift 5.0 and Above

Working

In case if you are splitting the String it creates two substrings and not two Strings . This below method will check for Any and convert it t0 NSNumber its easy to convert a NSNumber to Int, Float what ever data type you need.

Actual Code

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

Usage

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

Passing String to check and convert to Double

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

Solution 30 - Ios

As of swift 3, I have to force my #%@! string & int with a "!" otherwise it just doesn't work.

For example:

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

Solution 31 - Ios

Convert String value to Integer in Swift 4

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMarwan QasemView Question on Stackoverflow
Solution 1 - IosParaneetharan SaravanaperumalView Answer on Stackoverflow
Solution 2 - IosNarendar Singh SainiView Answer on Stackoverflow
Solution 3 - IosKumar KLView Answer on Stackoverflow
Solution 4 - IosAbaho KatabarwaView Answer on Stackoverflow
Solution 5 - IosLeo DabusView Answer on Stackoverflow
Solution 6 - IosOOMMENView Answer on Stackoverflow
Solution 7 - IosPankaj NigamView Answer on Stackoverflow
Solution 8 - IosNareshView Answer on Stackoverflow
Solution 9 - IostorcellyView Answer on Stackoverflow
Solution 10 - IosgargView Answer on Stackoverflow
Solution 11 - IosViral SavaliyaView Answer on Stackoverflow
Solution 12 - IosAliRaza QureshiView Answer on Stackoverflow
Solution 13 - IosKoushikView Answer on Stackoverflow
Solution 14 - IosAlessandro OrnanoView Answer on Stackoverflow
Solution 15 - Iosuser7642519View Answer on Stackoverflow
Solution 16 - IosRonTLVView Answer on Stackoverflow
Solution 17 - IosNirmalsinh RathodView Answer on Stackoverflow
Solution 18 - IosfzhView Answer on Stackoverflow
Solution 19 - IosNarendar Singh SainiView Answer on Stackoverflow
Solution 20 - IosNaishtaView Answer on Stackoverflow
Solution 21 - IosJennyView Answer on Stackoverflow
Solution 22 - IosDàChúnView Answer on Stackoverflow
Solution 23 - IosPenggunaView Answer on Stackoverflow
Solution 24 - IosDurul DalkanatView Answer on Stackoverflow
Solution 25 - Iosflame3View Answer on Stackoverflow
Solution 26 - IosKrunalView Answer on Stackoverflow
Solution 27 - IosRavi KumarView Answer on Stackoverflow
Solution 28 - IosPatrickView Answer on Stackoverflow
Solution 29 - IosKoushikView Answer on Stackoverflow
Solution 30 - IosSam BView Answer on Stackoverflow
Solution 31 - IosMahesh ChaudhariView Answer on Stackoverflow