409

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
2
  • 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. Commented Nov 29, 2018 at 14:00
  • @ArivenNadar "23.0" is not an integer and has utterly, nothing, at all, to do with integers. If someone on the team tells you to "convert" something like "23.0 to an int" - they would be fired that afternoon. Commented Apr 2 at 0:24

32 Answers 32

376

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)
Sign up to request clarification or add additional context in comments.

6 Comments

Can i ask why i am getting an error when i omit the '?' char? Why do i need to state 'a' as an optional?
@ManosSerifios this discussion may helpful : stackoverflow.com/questions/32621022/…
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
I am printing Int(firstText.text)! and then I still see optional. Why? Have I not unwrapped it?
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 ?? "").
|
347

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

10 Comments

Thanks this works. However, I have an issue since I want the numbers to include floats too. Thanks again.
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?
I get 'NSString' does not have a member named 'toInt'. Any Ideas?
NSString and String are two different objects and have different methods. NSString has a method called .intValue
This solution was only right for Swift and not for Swift2. Now you should use: Int(firstText.text)
|
93

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

3 Comments

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
pls clarify "latest Swift Versions" for posterity's hoped lack of confusion :)
@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?
40

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
  }

1 Comment

I just changed it to 'myNumber.integerValue' since Xcode 7 won't build with 'intValue'. The latter is of Int32 value
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

Comments

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 
  }

Comments

16

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)

2 Comments

Regarding: Int(string)! if string is nil, Int? optional will be nil and then unwrapping the nil optional will result in a crash
@ jcpennypincher, can you update the answer. OR post new answer, it can helpful to others. Thank you.
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

    }

Comments

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

Comments

7

In Swift 4:

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

Comments

7

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

Comments

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.

Comments

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

Comments

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

1 Comment

Thank you this worked for my case. Int() was working for me with 16 digit numbers but recently started to fail.
3

Latest swift3 this code is simply to convert string to int

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

Comments

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

Comments

2

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

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

Comments

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

Comments

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

Comments

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

Comments

1

This works for me

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

2 Comments

How is this different from the solution given in the comment?
The solution given in the comment is missing "!" at the end , which is expected in Swift 2 and onwards
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
        }
    }
}

Comments

1

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

Comments

1

If s is a non-optional string,

It's just

let n = Int(s) ?? 0

"0" is the default you choose if the string does not parse.

n is now definitely an int - not an optional int. (Test that by clicking on it and looking at the QuickHelp in Xcode.)


However, if s is an optional string ...

let n = Int(s ?? "") ?? 0

A good example is that .text is annoyingly optional.

let n = Int(someTextField.text ?? "") ?? 0

"0" is the default you choose if the string does not parse.

n is now definitely an int - not an optional int. (Test that by clicking on it and looking at the QuickHelp in Xcode.)

That's the whole thing.


An array of strings safely ...

Very often ...

let ids = ["13", "69", "666", "bad value", ""]

then ...

let intIds = ids.compactMap{Int($0)}

result: [13, 69, 666]

The bad values, result in a nil, which .compactMap throws away.


If the string is something like "23.0" ...

That is not an integer and has utterly no connection, in any way, to integers. If someone tells you to "convert" that to an integer, they're not a computer programmer.

Handling such issues is a matter of the algorithms and data structures involved in the project at hand. If you're just starting out with Swift, Swift has a complex (but incomplete) set of "rounding" tools that can (sometimes) help in such situations.

4 Comments

Much better to extend LosslessStringConvertible. This would allow you use optional chaining trailing syntax making it also generic so it can be used with all types that conform to it like Double, Float, Int, Uint, and so on. There is only 2 numeric types that it wouldn’t be covered Decimal and CGFloat that you could accomplish extending CustomStringConvertible
LD while it's critical to know about NumericTransformable, in any actual commercial project there's only one concern. Cost. Currewt prograsmemrs are only the current programmers and are irrelevant compared to the Actual Programmers (ie, the Future Programmers!!) You have to have "zero investigation time" on literally every single line of code. If I came across the mentioned extensions on a normal commercial project, I'd have to assign two guys, 3-10 days to thoroughly investigate how it works and what it's meant to do, write unit tests, document every single use of it in the whole
code base, make a video or tutorial for future programmers (because, as always, those "future programmers" are irrelevant, all that matters is the cost of future-future programmers!), and so on. Alternately you can use "Int()" which is part of Swift. It's tough! Also in practice if it's (say) banking or anything financial all of this is irrelevant and it's totally different. :O
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)

Comments

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

}

Comments

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
}

Comments

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.

Comments

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

Comments

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)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.