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


352

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

@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

7
Не пробовал, но, возможно, вы могли бы разыграть такие значения, какvar answer1 = Int(txtBox1.text)
Даниэль

Если в вашей строке предполагается, что "23.0", то если вы приведете ее к Int ("23.0"), она вернет nil, для этого случая вам сначала нужно привести к Double / Float, а затем снова к Int.
Аривен Надар

Ответы:


326

Основная идея, обратите внимание, что это работает только в 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
...

Спасибо, это работает. Однако у меня есть проблема, так как я хочу, чтобы числа тоже включали числа с плавающей точкой. Еще раз спасибо.
Марван Касем

4
Если вам нужны float (и вы действительно хотите Double, а не float), toInt () этого не сделает. Не могли бы вы использовать свое воображение и доступную документацию, чтобы найти подходящую функцию?
gnasher729

4
Я получаю 'NSString' does not have a member named 'toInt'. Любые идеи?
Matej

1
NSStringи Stringдва разных объекта и имеют разные методы. NSStringимеет метод под названием.intValue
Байрон Кётзее

7
Это решение было правильным только для Swift, а не для Swift2. Теперь вы должны использовать: Int (firstText.text)
gurehbgui

337

Обновить ответ для 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

Могу ли я спросить, почему я получаю ошибку, когда опускаю '?' символ? Почему мне нужно указать «а» в качестве необязательного?
Manos Serifios

1
@ManosSerifios это обсуждение может быть полезным: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal

не совсем связанный, но конструкторский подход всегда предпочтительнее и более читабелен для Int для Strings. "\(someInt)"не хорошо String(someInt), намного легче читать
Honey

Я печатаю, Int(firstText.text)!а потом все еще вижу необязательно. Почему? Разве я не развернул это?
Мед

Это будет сбой, когда строка nil. Может не произойти, если строка поступает из элемента пользовательского интерфейса, как в этом случае. Но один способ предотвратить аварии, чтобы добавить значение по умолчанию в строке: let a:Int? = Int(firstText.text ?? "").
Йенс

85

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

Swift 3.x

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

let myInt = Int(textField.text)

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

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

1
это на самом деле отвечает на вопрос, все остальные говорят ОП, как
выбрать

1
Пример для Swift 3?
Питер Крейнз

Просьба уточнить «последние версии Swift» для надежды
Алекс Холл,

@aremvee ты имеешь в виду "привести" целое число в виде строки? И что именно это делает, что отвечает на вопрос, который не отвечают другие?
Алекс Холл

31

редактировать / обновление: Xcode 11.4 • Swift 5.2

Пожалуйста, проверьте комментарии через код


Содержимое файла IntegerField.swift :

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

Вам также необходимо добавить эти расширения в ваш проект:


Расширения UITextField.swift содержимое файла:

import UIKit
extension UITextField {
    var string: String { text ?? "" }
}

Расширения файла Formatter.swift:

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

Содержимое файла расширений NumberFormatter.swift :

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

Содержимое файла расширений StringProtocol.swift :

extension StringProtocol where Self: RangeReplaceableCollection {
    var digits: Self { filter(\.isWholeNumber) }
    var integer: Int? { Int(self) }
}

Пример проекта


27

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

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
Я просто изменил его на «myNumber.integerValue», так как Xcode 7 не будет собираться с «intValue». Последний имеет значение Int32
мозговой

21

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 
  }

14

// Xcode 8.1 и swift 3.0

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

let occur = "10"

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

    }

11

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

Относительно: Int (строка)! если строка ноль, Int? опционально будет ноль, а затем распаковка ноль опционально приведет к сбою
jcpennypincher

7

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

7

В Swift 4:

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

4

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

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


4

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


4

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

3

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

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
Спасибо, это сработало для моего случая. Int () работал для меня с 16-значными числами, но недавно начал терпеть неудачу.
Райан Бойд

3

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

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

2

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

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

useLabelInt()

2

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

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

1

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

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

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


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

1

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

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

Чем это отличается от решения, приведенного в комментарии?
чернослив

2
Решение, указанное в комментарии, отсутствует "!" в конце, который ожидается в Swift 2 и далее
Naishta

1

для Swift3.x

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

0

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

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

"2" .Добавьте (1)


0

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

}

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
}

0

Вопрос: строку «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")!)! чтобы получить правильный результат.


0

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

0

Swift 5.0 и выше

За работой

В случае, если вы разделяете, Stringсоздается два, substringsа не два Strings. Этот метод ниже будет проверять Anyи конвертировать его, 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)

0

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

-1

Начиная с 3-го , я должен заставить свой #% @! строка & 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

Вы не можете просто сделать var counterInt = counter.map { Int($0) }? Где counterбы это могло бытьString?
Мартин

@ Мартин - Нет? делает его необязательным и тем самым добавляет слово «необязательный» в строку счетчика.
Сэм Б

ИМХО, не стоит насильно распаковывать ваши опционы. Предпочитают использовать guardи if letзаявления
Мартин

-1

Преобразовать строковое значение в целое число в Swift 4

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.