Преобразование строки в 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

32 ответа

Решение

Основная идея, обратите внимание, что это работает только в Swift 1.x (посмотрите ответ ParaSara, чтобы увидеть, как это работает в 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"
    }

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

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

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

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

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

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

Swift 3.x

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

let myInt = Int(textField.text)

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

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

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

     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
     }

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

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
}

Вы также можете использовать Необязательное связывание, кроме принудительного связывания.

например:

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

В Swift 4.2 и Xcode 10

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)

//Xcode 8.1 и swift 3.0

Мы также можем справиться с этим путем опционального связывания, просто

let occur = "10"

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

    }

В Swift 4:

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

Свифт 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

Полезно для 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

Swift 3.0

Попробуйте это, вам не нужно проверять какие-либо условия, я сделал все, просто используйте эту функцию. Отправить что-нибудь строку, число, число с плавающей запятой, двойной, и т. Д. Вы получаете число в качестве значения или 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 имеет номер или строку, он возвращает номер, иначе он возвращает 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

Я сделал простую программу, где у вас есть 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)"
}

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

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

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

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

let bytesInternet : Int64 = Int64(bytesInternetString)!

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

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

Swift5 float или int строка для 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())

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

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

useLabelInt()

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

Int (туЗЬптд)

В вашем случае вы можете использовать Int(textField.text!) Вместо 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)

Для Swift3.x

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

Свифт 4, Свифт 5

Существуют разные случаи преобразования чего-то в какой-то тип данных, это зависит от ввода.

Если тип входных данных Any, мы должны использовать asпрежде чем преобразовать в фактический тип данных, затем преобразовать в тип данных, который мы хотим. Например:

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

Использовать этот:

// 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 или.

Надеюсь, это поможет!

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

var a:Int? = Int(userInput.text!)
//  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);

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

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

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

"2".add (1)

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

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

}

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

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

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

Swift 5.0 и выше

За работой

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

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

//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)
Другие вопросы по тегам