Преобразование строки в 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.х,.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);
для 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.х, .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)
мое решение состоит в том, чтобы иметь общее расширение для преобразования строки в 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, Я должен заставить мой #%@! строка & 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")?
ответ : Инт() проверяет строку, целое число или нет, если да, то дам тебе число, а иначе не пропустит. но Float или Double может преобразовать любую числовую строку в соответствующую Float или Double, не давая nil. Например, если у вас есть целочисленная строка" 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
Comments