368

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
Eric Aya
  • 68,765
  • 33
  • 165
  • 232
Marwan Qasem
  • 3,691
  • 2
  • 9
  • 4
  • 7
    Haven't tried but maybe you could cast the values like `var answer1 = Int(txtBox1.text)` – Daniel Jun 09 '14 at 07:10
  • 1
    If you string is suppose "23.0", then if you cast it to Int("23.0") it will return nil, for this case you first need to cast to Double/Float and then again cast to Int. – Ariven Nadar Nov 29 '18 at 14:00

30 Answers30

341

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)
Pranav Kasetti
  • 4,773
  • 2
  • 16
  • 38
  • Can i ask why i am getting an error when i omit the '?' char? Why do i need to state 'a' as an optional? – Manos Serifios Jun 02 '16 at 20:16
  • 1
    @ManosSerifios this discussion may helpful : http://stackoverflow.com/questions/32621022/why-was-uitextfields-text-property-changed-to-an-optional-in-swift-2 – Paraneetharan Saravanaperumal Jun 03 '16 at 05:36
  • not truly related but the constructor approach is always preferred and more readable for Int to Strings. `"\(someInt)"` is not good `String(someInt)` is much easier to read – Honey Sep 30 '16 at 16:09
  • I am printing `Int(firstText.text)!` and then I still see optional. Why? Have I not unwrapped it? – Honey Nov 22 '16 at 17:50
  • This will crash when the string is `nil`. Might not happen when the string comes from a UI element like in this case. But one way to prevent the crash is to add a default value to the string: `let a:Int? = Int(firstText.text ?? "")`. – Jens Dec 08 '17 at 14:14
  • @Jens `UITextField`'s `text` property is optional but its default value is an empty string. It will NEVER return `nil` even if you assign `nil` to it before accessing its value. `if let value = Int(textField.text!) { print(value) }` or using nil coalescing operator `let value = Int(textField.text!) ?? .zero` – Leo Dabus Jul 20 '20 at 02:29
336

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
...
Anton Belousov
  • 1,089
  • 14
  • 32
Narendar Singh Saini
  • 3,375
  • 1
  • 13
  • 17
  • Thanks this works. However, I have an issue since I want the numbers to include floats too. Thanks again. – Marwan Qasem Jun 12 '14 at 18:15
  • Do you know how to do it? – Marwan Qasem Jun 12 '14 at 18:16
  • 4
    If you need floats (and you really really want Double, not float), toInt() will not do it. Could you use your imagination and the available documentation to find a suitable function? – gnasher729 Jun 13 '14 at 07:18
  • below I provided another solution for dealing with Doubles – Narendar Singh Saini Jun 13 '14 at 07:28
  • 4
    I get `'NSString' does not have a member named 'toInt'`. Any Ideas? – Matej Nov 04 '14 at 11:16
  • 1
    `NSString` and `String` are two different objects and have different methods. `NSString` has a method called `.intValue` – Byron Coetsee Jan 22 '15 at 12:24
  • 7
    This solution was only right for Swift and not for Swift2. Now you should use: Int(firstText.text) – gurehbgui Sep 27 '15 at 10:36
  • This works in Swift 1.2 Playground, but when I use in Console app with input from command line I get: `fatal error: unexpectedly found nil while unwrapping an Optional value` i.e. `println("a = \(a!)")` – Giant Elk Jul 01 '16 at 20:17
  • I figured out partly why this was failing, if I DO NOT use ? Optional AND strip off last character (newline) it works. Here's my strip func, Swift 1.2 ```func stripNewLine(input: String) -> String { let inputLength = input.utf16Count - 1 return (input as NSString).substringToIndex(inputLength) }```, and new Question: http://stackoverflow.com/questions/38154548/optional-issue-converting-string-to-int-in-swift-1-2 – Giant Elk Jul 01 '16 at 22:32
  • Note that `UITextField`'s `text` property is optional `Int(textField.text!)` – Leo Dabus Jul 20 '20 at 02:27
87

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
Kumar KL
  • 15,086
  • 9
  • 36
  • 57
  • 1
    this actually answers the question, all of the others tell the OP how to coast an Integer as a String, which is not what he was asking – aremvee Jul 08 '15 at 12:19
  • pls clarify "latest Swift Versions" for posterity's hoped lack of confusion :) – Alex Hall Jul 03 '17 at 21:44
  • @aremvee do you mean "cast" an integer as a string? And what exactly does this do that answers the question which the other answers don't? – Alex Hall Jul 03 '17 at 21:46
33

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

Leo Dabus
  • 198,248
  • 51
  • 423
  • 494
30

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
  }
Theo
  • 3,066
  • 26
  • 49
Abaho Katabarwa
  • 309
  • 3
  • 2
  • 1
    I just changed it to 'myNumber.integerValue' since Xcode 7 won't build with 'intValue'. The latter is of Int32 value – brainray Jun 09 '15 at 11:39
22

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 
  }
OOMMEN
  • 229
  • 3
  • 6
15

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

    }
CupawnTae
  • 13,144
  • 2
  • 25
  • 59
Pankaj Nigam
  • 308
  • 2
  • 7
11

In Swift 4.2 and 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
  • 11,881
  • 4
  • 71
  • 92
  • Regarding: Int(string)! if string is nil, Int? optional will be nil and then unwrapping the nil optional will result in a crash – jcpennypincher Jun 16 '20 at 00:28
  • @ jcpennypincher, can you update the answer. OR post new answer, it can helpful to others. Thank you. – iOS Jun 30 '20 at 06:30
7

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
John R Perry
  • 3,357
  • 1
  • 30
  • 46
torcelly
  • 446
  • 4
  • 7
7

In Swift 4:

extension String {            
    var numberValue:NSNumber? {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter.number(from: self)
    }
}
let someFloat = "12".numberValue
garg
  • 2,344
  • 20
  • 20
4

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.

chedabob
  • 5,716
  • 2
  • 23
  • 42
4

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

Koushik
  • 1,110
  • 14
  • 19
4

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
Viral Savaliya
  • 130
  • 1
  • 4
3

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)!
Alessandro Ornano
  • 31,579
  • 11
  • 90
  • 115
  • 1
    Thank you this worked for my case. Int() was working for me with 16 digit numbers but recently started to fail. – Ryan Boyd Apr 30 '16 at 07:03
3

Latest swift3 this code is simply to convert string to int

let myString = "556"
let myInt = Int(myString)
shim
  • 7,170
  • 10
  • 62
  • 95
2

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()
RonTLV
  • 2,010
  • 2
  • 19
  • 31
2

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

        let strValue = "123"
        let result = (strValue as NSString).integerValue
Nirmalsinh
  • 4,965
  • 3
  • 21
  • 48
2

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())
fzh
  • 658
  • 1
  • 5
  • 13
1

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

Narendar Singh Saini
  • 3,375
  • 1
  • 13
  • 17
1

This works for me

var a:Int? = Int(userInput.text!)
rptwsthi
  • 9,855
  • 10
  • 65
  • 102
Naishta
  • 9,905
  • 4
  • 60
  • 49
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
  • 45
  • 7
1

for 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
  • 4,079
  • 1
  • 31
  • 37
0

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)

Durul Dalkanat
  • 6,580
  • 4
  • 32
  • 34
0

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

}
flame3
  • 2,280
  • 1
  • 17
  • 30
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
  • 68,602
  • 40
  • 230
  • 241
0

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.

Ravi Kumar
  • 1,249
  • 12
  • 21
0

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
    }
}
Patrick
  • 514
  • 4
  • 14
0

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)
Koushik
  • 1,110
  • 14
  • 19
-1

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
Sam B
  • 25,617
  • 14
  • 79
  • 115
  • Can't you just do `var counterInt = counter.map { Int($0) }` ? Where `counter` whould be a `String?` – Martin Oct 19 '17 at 16:34
  • @Martin - No. ? makes its optional and thus adds the word "optional" to the counter string. – Sam B Oct 19 '17 at 22:27
  • IMHO, you should not force unwrap your optionals. Prefer use `guard` and `if let` statements – Martin Oct 20 '17 at 07:56
-1

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)!