Преобразование строки в Int с помощью Swift

Приложение в основном вычисляет ускорение путем ввода начальной и конечной скорости и времени, а затем использует формулу для расчета ускорения. Однако, поскольку значения в текстовых полях являются строками, я не могу преобразовать их в целые числа.

@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

Ответ 1

Основная идея, обратите внимание, что это работает только в Swift 1.x (проверьте ParaSara ответ, чтобы увидеть, как он работает в Swift 2.x):

    // toInt returns optional that 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"
    }

Обновление для Swift 4

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

Ответ 2

Обновить ответ для swift 2.0:

toInt() задана ошибка. Поскольку в Swift 2.x функция .toInt() была удалена из String. Взамен Int теперь имеет инициализатор, который принимает строку:

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

Ответ 3

myString.toInt() - преобразовать значение строки в int.

Swift 3.x

Если у вас есть целое число, скрывающееся внутри строки, вы можете преобразовать с помощью целочисленного конструктора, например:

let myInt = Int(textField.text)

Как и в случае с другими типами данных (Float и Double), вы также можете конвертировать с помощью NSString:

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

Ответ 4

Xcode 8.3.2 • Swift 3.1

class IntegerField: UITextField {
    var integer: Int {
        return string.digits.integer
    }
    override func willMove(toSuperview newSuperview: UIView?) {
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        keyboardType = .numberPad
        textAlignment = .right
        editingChanged()
    }
    func editingChanged() {
        text = Formatter.decimal.string(for: integer)
        print(integer)
    }
}

Требуемые расширения, структуры и инициализаторы:

extension Sequence where Iterator.Element == UnicodeScalar {
    var string: String { return String(String.UnicodeScalarView(self)) }
}

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

extension UITextField {
    var string: String { return text ?? "" }
}

extension String {
    private static var digitsPattern = UnicodeScalar("0")..."9"
    var digits: String {
        return unicodeScalars.filter { String.digitsPattern ~= $0 }.string
    }
    var integer: Int { return Int(self) ?? 0 }
}

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

Ответ 5

Вы хотите использовать NSNumberFormatter().numberFromString(yourNumberString). Это здорово, потому что он возвращает необязательный вариант, который вы затем можете проверить с помощью "if let", чтобы определить, было ли преобразование успешным. например.

     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
     }

Ответ 6

быстрый 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
}

вы также можете использовать опциональную привязку, кроме принудительной привязки.

например:

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

Ответ 7

//Xcode 8.1 и swift 3.0

Мы также можем обрабатывать его с помощью необязательного привязки, просто

let occur = "10"

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

    }

Ответ 8

Swift 3

Самый простой и безопасный способ:

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

Избегайте недопустимых значений, задающих тип клавиатуры для цифровой клавиатуры:

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

Ответ 9

В Swift 4:

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

Ответ 10

В Swift 4.2 и 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)

Ответ 11

Я сделал простую программу, в которой у вас есть 2 поля txt, которые вы вводите в форму пользователя и добавляете их, чтобы упростить понимание, пожалуйста, найдите код ниже.

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

надеюсь, что это поможет.

Ответ 12

О int() и Swift 2.x: если вы получите значение nil после проверки конверсии, если вы попытаетесь преобразовать строку с большим числом (например: 1073741824), в этом случае попробуйте:

let bytesInternet : Int64 = Int64(bytesInternetString)!

Ответ 13

Swift 3.0

Попробуйте это, вам не нужно проверять какое-либо условие, которое я сделал, просто использую эту функцию. Отправить что-нибудь строку, число, float, double и т.д. вы получаете число как значение или 0, если оно неспособно преобразовать ваше значение

Функция:

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
}

Применение: Добавьте вышеприведенную функцию в код и для конвертирования let myNumber = getNumber(number: myString)  если myString имеет число или строку, он возвращает число else, которое возвращает 0

Пример 1:

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

Выход: printing number 9834

Пример 2:

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

Выход: printing number 9834

Пример 3:

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

Выход: printing number 9834

Ответ 14

Последний swift3, этот код просто преобразует строку в int

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

Ответ 15

Поскольку строка может содержать нечисловые символы, вы должны использовать guard для защиты операции. Пример:

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

useLabelInt()

Ответ 16

Используйте это:

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

ИЛИ

Сделайте свой UITextField KeyboardType как DecimalTab из вашего XIB или раскадровки и удалите любое условие if для любого вычисления, т.е.

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

Поскольку тип клавиатуры - DecimalPad, нет возможности ввести другие 0-9 или.

Надеюсь на эту помощь!

Ответ 17

Это работает для меня

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

Ответ 18

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

Ответ 19

для Swift3.x

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

Ответ 20

В Swift 2.x функция.toInt() была удалена из String. Взамен Int теперь имеет инициализатор, который принимает строку

Int (туЗЬптд)

В вашем случае вы можете использовать Int (textField.text!) Insted textField.text!.ToInt()

Swift 1.x

let myString: String = "256"
let myInt: Int? = myString.toInt()

Swift 2.x, 3.x

let myString: String = "256"
let myInt: Int? = Int(myString)

Ответ 21

для альтернативного решения. Вы можете использовать расширение родного типа. Вы можете протестировать с детской площадкой.

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

"2".add(1)

Ответ 22

Мое решение состоит в том, чтобы иметь общее расширение для преобразования строки в 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  
        }
    }

}

Ответ 23

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

Ответ 24

Как и у swift 3, мне нужно заставить мой #% @! string и int с "!" иначе он просто не работает.

Например:

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

Ответ 25

Вопрос: строка "4.0000" не может быть преобразована в целое число с использованием Int ("4.000")?

Ответ: строка проверки Int() является целым числом или нет, если да, то дайте целое число и в противном случае значение nil. но Float или Double могут преобразовывать любую строку чисел в соответствующий Float или Double без указания нулевого значения. Пример, если у вас есть целая строка "45", но с использованием Float ("45") дает вам значение с плавающей запятой 45,0 или с помощью Double ("4567") дает вам 45,0.

Решение: NSString (строка: "45.000"). IntegerValue или Int (Float ("45.000")!)! чтобы получить правильный результат.

Ответ 26

Я недавно получил ту же проблему. Ниже приведена работа для меня:

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

Ответ 27

Int в Swift содержит инициализатор, который принимает строку. Возвращает необязательный Int? так как преобразование может завершиться неудачей, если строка не содержит число.

Используя оператор if let, вы можете проверить, успешно ли выполнено преобразование.

Итак, ваш код стал примерно таким:

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

Ответ 28

Полезно для String to Int и другого типа

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

Используйте это как:

"123".toInt() // 123

Ответ 29

Swift 5.0 и выше

За работой

В случае, если вы разделяете String она создает две substrings а не две Strings. Этот ниже метод проверит для Any и преобразует его в t0 NSNumber его легко конвертировать NSNumber в Int, Float NSNumber тип данных, который вам нужен.

Актуальный код

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

использование

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

}

Передача String для проверки и преобразования в Double

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

Ответ 30

Преобразование значения String в Integer в Swift 4

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