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

25 ответов


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

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

let myInt = Int(textField.text)

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

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

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 ~=  }.string
    }
    var integer: Int { return Int(self) ?? 0 }
}

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

вы хотите использовать 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
     }

/ / Xcode 8.1 и swift 3.0

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

let occur = "10"

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

    }

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

В Swift 4:

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

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

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


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

let bytesInternet : Int64 = Int64(bytesInternetString)!

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

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

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


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

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

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


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

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

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

для Swift3.x

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

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

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

useLabelInt()

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

Int (myString)

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

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

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

"2".добавить(1)


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

}

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

по состоянию на 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

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

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

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


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

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