Преобразование строки в 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
Ответы
Ответ 1
Основная идея, обратите внимание, что это работает только в 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
...
Ответ 2
Обновить ответ для 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
Ответ 3
myString.toInt()
- преобразовать значение строки в int.
Swift 3.x
Если у вас есть целое число, скрывающееся внутри строки, вы можете преобразовать с помощью целочисленного конструктора, например:
let myInt = Int(textField.text)
Как и в случае с другими типами данных (Float и Double), вы также можете конвертировать с помощью NSString:
let myString = "556"
let myInt = (myString as NSString).integerValue
Ответ 4
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
}
}
Ответ 5
Вы хотите использовать 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
}
Ответ 6
быстрый 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
}
Ответ 7
//Xcode 8.1 и swift 3.0
Мы также можем обрабатывать его с помощью необязательного привязки, просто
let occur = "10"
if let occ = Int(occur) {
print("By optional binding :", occ*2) // 20
}
Ответ 8
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
Ответ 9
В Swift 4:
extension String {
var numberValue:NSNumber? {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter.number(from: self)
}
}
let someFloat = "12".numberValue
Ответ 10
В 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)
Ответ 11
Я сделал простую программу, в которой у вас есть 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)"
}
надеюсь, что это поможет.
Ответ 12
О int() и Swift 2.x: если вы получите значение nil после проверки конверсии, если вы попытаетесь преобразовать строку с большим числом (например: 1073741824), в этом случае попробуйте:
let bytesInternet : Int64 = Int64(bytesInternetString)!
Ответ 13
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
Ответ 14
Последний swift3, этот код просто преобразует строку в int
let myString = "556"
let myInt = Int(myString)
Ответ 15
Поскольку строка может содержать нечисловые символы, вы должны использовать guard
для защиты операции. Пример:
guard let labelInt:Int = Int(labelString) else {
return
}
useLabelInt()
Ответ 16
Используйте это:
// 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 или.
Надеюсь на эту помощь!
Ответ 17
Это работает для меня
var a:Int? = Int(userInput.text!)
Ответ 18
// 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);
Ответ 19
для Swift3.x
extension String {
func toInt(defaultValue: Int) -> Int {
if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
return n
} else {
return defaultValue
}
}
}
Ответ 20
В 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)
Ответ 21
для альтернативного решения. Вы можете использовать расширение родного типа. Вы можете протестировать с детской площадкой.
extension String {
func add(a: Int) -> Int? {
if let b = Int(self) {
return b + a
}
else {
return nil
}
}
}
"2".add(1)
Ответ 22
Мое решение состоит в том, чтобы иметь общее расширение для преобразования строки в 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
}
}
}
Ответ 23
@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
}
Ответ 24
Как и у 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
Ответ 25
Вопрос: строка "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")!)! чтобы получить правильный результат.
Ответ 26
Я недавно получил ту же проблему. Ниже приведена работа для меня:
let strValue = "123"
let result = (strValue as NSString).integerValue
Ответ 27
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
}
}
Ответ 28
Полезно для 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
Ответ 29
Swift 5.0 и выше
За работой
В случае, если вы разделяете String
она создает две substrings
а не две Strings
. Этот ниже метод проверит для Any
и преобразует его в t0 NSNumber
его легко конвертировать NSNumber
в Int
, Float
NSNumber
тип данных, который вам нужен.
Актуальный код
//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)
Ответ 30
Преобразование значения String в Integer в Swift 4
let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!