Перетворення рядка в 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"), він поверне нуль, для цього вам потрібно спочатку кинути на 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
Якщо вам потрібні floats (і ви дуже хочете Double, а не float), toInt () цього не зробить. Чи можете ви використати свою уяву та наявну документацію, щоб знайти відповідну функцію?
gnasher729

4
Я отримую 'NSString' does not have a member named 'toInt'. Будь-які ідеї?
Матей

1
NSStringі Stringє двома різними об'єктами і мають різні методи. NSStringмає метод під назвою.intValue
Байрон Котзее

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

337

Оновити відповідь для швидкої 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

Чи можу я запитати, чому я отримую помилку, коли пропускаю '?' char? Чому мені потрібно вказати "a" як необов'язковий?
Манос Серіфіос

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.

Швидкий 3.x

Якщо у вас є ціле число, яке ховається в рядку, ви можете конвертувати за допомогою конструктора цілого числа, наприклад:

let myInt = Int(textField.text)

Як і в інших типах даних (Float і Double), ви також можете конвертувати за допомогою NSString:

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

1
це насправді відповідає на питання, всі інші розповідають ОП, як узбережжя цілої людини як струна, а це не те, що він просив
aremvee

1
Приклад для Swift 3?
Пітер Крейнц

pls уточнити "останні версії 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
}

Швидкий 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

швидкий 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)

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: якщо ви отримаєте нульове значення після перетворення, перевірте, чи намагаєтесь ви перетворити рядок з великим числом (наприклад: 1073741824), у цьому випадку спробуйте:

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
Дякую, що це працювало для моєї справи. Int () працював для мене з 16-значним числом, але нещодавно почав виходити з ладу.
Райан Бойд

3

Останній swift3 цей код - це просто перетворити рядок в int

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

2

Оскільки рядок може містити нечислові символи, ви повинні використовувати a 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 або дошки та вилучіть будь-яку, якщо умова для будь-якого обчислення, тобто.

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
Рішення, подане в коментарі, відсутнє "!" наприкінці, який очікується у
Свіфті

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" .add (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") дає значення float 45.0 або використання Double ("4567") дає 45,0.

Рішення: NSString (рядок: "45.000"). IntegerValue або Int (Float ("45.000")!)! щоб отримати правильний результат.


0

Int in Swift містить ініціалізатор, який приймає String. Він повертає необов'язковий 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

Швидкий 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)

0

Swift5 float або 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())

-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?
Мартін

@Martin - Ні? робить його необов’язковим і, таким чином, додає слово "необов'язково" до рядка лічильника.
Сем Б

ІМХО, ви не повинні змушувати розгортати необов’язкові. Віддайте перевагу використанню 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.