it-swarm.com.ru

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

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

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

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

Swift 3.x  

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

let myInt = Int(textField.text)

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

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

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
    }
}
31
Leo Dabus

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

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

// Xcode 8.1 и Swift 3.0

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

let occur = "10"

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

    }
14
Pankaj Nigam

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

В Swift 4:

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

я сделал простую программу, в которой у вас есть 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
AliRaza Qureshi

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

3
Koushik

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

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

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

let bytesInternet : Int64 = Int64(bytesInternetString)!
3
Alessandro Ornano

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

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

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

useLabelInt()
2
RonTLV
//  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
Jenny

для Swift3.x

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

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

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

OR

Сделайте ваш UITextField KeyboardType как DecimalTab из вашей XIB или раскадровки и удалите любое условие if для выполнения каких-либо вычислений, т.е.

var ans = a + b
answerLabel.text = "Answer is \(ans)"

Поскольку тип клавиатуры - DecimalPad, нет возможности ввести другие 0-9 или.

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

1
Narendar Singh Saini

В Swift 2.x функция .toInt () была удалена из строки. Вместо этого 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)
1
Azarmanesh

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

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

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

Вопрос: строку «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
Ravi H Malviya

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

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)
0
Koushik

Начиная с Swift 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
0
Sam B

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

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

"2" .add (1)

0
Durul Dalkanat
@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
Krunal

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
Patrick

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

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