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

301

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

@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
  • 6
    Не пробовал, но, возможно, вы могли бы привести такие значения, как var answer1 = Int(txtBox1.text)
  • 0
    Если в вашей строке предполагается, что "23.0", то если вы приведете ее к Int ("23.0"), она вернет nil, для этого случая вам сначала нужно привести к Double / Float, а затем снова к Int.
Теги:
int
uitextfield

27 ответов

233
Лучший ответ

Основная идея, обратите внимание, что это работает только в 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
...
  • 0
    Спасибо, это работает. Однако у меня есть проблема, так как я хочу, чтобы числа тоже включали числа с плавающей точкой. Еще раз спасибо.
  • 0
    Ты знаешь как это сделать?
Показать ещё 8 комментариев
327

Обновить ответ для 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
  • 0
    Могу ли я спросить, почему я получаю ошибку, когда опускаю '?' обугливается? Почему мне нужно указать «а» в качестве необязательного?
  • 1
    @ManosSerifios это обсуждение может быть полезным: stackoverflow.com/questions/32621022/…
Показать ещё 4 комментария
72

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?
Показать ещё 2 комментария
31

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

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

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

    }
7

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
5

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

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

3

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

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

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

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

3

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

let bytesInternet : Int64 = Int64(bytesInternetString)!
  • 1
    Спасибо, это сработало для моего случая. Int () работал для меня с 16-значными числами, но недавно начал терпеть неудачу.
2

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

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

useLabelInt()
1

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

для Swift3.x

extension String {
    func toInt(defaultValue: Int) -> Int {
        if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
            return n
        } else {
            return defaultValue
        }
    }
}
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!)
  • 0
    Чем это отличается от решения, приведенного в комментарии?
  • 2
    Решение, указанное в комментарии, отсутствует "!" в конце, что ожидается в Swift 2 и далее
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 или.

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

0

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

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

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

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

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

0

Как и у 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
  • 0
    Разве вы не можете просто сделать var counterInt = counter.map { Int($0) } ? Если counter whould быть String?
  • 0
    @ Мартин - Нет? делает его необязательным и тем самым добавляет слово «необязательный» в строку счетчика.
Показать ещё 1 комментарий
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

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

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

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

"2".add(1)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню