Konversi String ke Int dengan Swift

352

Aplikasi ini pada dasarnya menghitung akselerasi dengan memasukkan kecepatan dan waktu awal dan akhir dan kemudian menggunakan rumus untuk menghitung akselerasi. Namun, karena nilai dalam kotak teks adalah string, saya tidak dapat mengonversinya menjadi bilangan bulat.

@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
Marwan Qasem
sumber
7
Belum mencoba tetapi mungkin Anda bisa memberikan nilai sepertivar answer1 = Int(txtBox1.text)
Daniel
Jika string Anda anggap "23.0", maka jika Anda melemparkannya ke Int ("23.0") itu akan mengembalikan nihil, untuk kasus ini Anda harus terlebih dahulu dilemparkan ke Double / Float dan kemudian kembali ke Int.
Ariven Nadar

Jawaban:

326

Ide Dasar, perhatikan bahwa ini hanya berfungsi di Swift 1.x (lihat jawaban ParaSara untuk melihat cara kerjanya di 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"
    }

Pembaruan untuk Swift 4

...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...
Narendar Singh Saini
sumber
Terima kasih, ini berhasil. Namun, saya memiliki masalah karena saya ingin angka untuk memasukkan mengapung juga. Terima kasih lagi.
Marwan Qasem
4
Jika Anda membutuhkan float (dan Anda benar-benar ingin Double, bukan float), toInt () tidak akan melakukannya. Bisakah Anda menggunakan imajinasi Anda dan dokumentasi yang tersedia untuk menemukan fungsi yang sesuai?
gnasher729
4
Saya mengerti 'NSString' does not have a member named 'toInt'. Ada Ide?
Matej
1
NSStringdan Stringdua objek yang berbeda dan memiliki metode yang berbeda. NSStringmemiliki metode yang disebut.intValue
Byron Coetsee
7
Solusi ini hanya tepat untuk Swift dan bukan untuk Swift2. Sekarang Anda harus menggunakan: Int (firstText.text)
gurehbgui
337

Perbarui Jawaban untuk swift 2.0 :

toInt()Metode diberikan kesalahan. Karena, Dalam Swift 2.x, .toInt()fungsi itu dihapus dari String. Sebagai gantinya, Int sekarang memiliki penginisialisasi yang menerima sebuah String:

let a:Int? = Int(firstText.text)     // firstText is UITextField  
let b:Int? = Int(secondText.text)   // secondText is UITextField
Paraneetharan Saravanaperumal
sumber
Bisakah saya bertanya mengapa saya mendapatkan kesalahan saat saya menghilangkan '?' arang? Mengapa saya harus menyatakan 'a' sebagai opsional?
Manos Serifios
1
@ManosSerifios diskusi ini mungkin membantu: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal
tidak benar-benar terkait tetapi pendekatan konstruktor selalu lebih disukai dan lebih mudah dibaca untuk Int to Strings. "\(someInt)"tidak baik String(someInt)jauh lebih mudah dibaca
Honey
Saya mencetak Int(firstText.text)!dan kemudian saya masih melihat opsional. Mengapa? Apakah saya belum membuka bungkusnya?
Sayang
Ini akan macet saat string nil. Mungkin tidak terjadi ketika string berasal dari elemen UI seperti dalam kasus ini. Tapi salah satu cara untuk mencegah kecelakaan adalah dengan menambahkan nilai default ke string: let a:Int? = Int(firstText.text ?? "").
Jens
85

myString.toInt() - ubah nilai string menjadi int.

Cepat 3.x

Jika Anda memiliki bilangan bulat yang bersembunyi di dalam sebuah string, Anda dapat mengonversi dengan menggunakan konstruktor bilangan bulat, seperti ini:

let myInt = Int(textField.text)

Seperti tipe data lainnya (Float dan Double) Anda juga dapat mengonversi dengan menggunakan NSString:

let myString = "556"
let myInt = (myString as NSString).integerValue
Kumar KL
sumber
1
ini benar-benar menjawab pertanyaan, semua yang lain memberi tahu OP bagaimana cara memasukkan Integer sebagai String, yang bukan apa yang dia tanyakan
aremvee
1
Contoh untuk Swift 3?
Peter Kreinz
mohon klarifikasi "Versi Swift terbaru" untuk anak cucu yang berharap kurangnya kebingungan :)
Alex Hall
@aremvee maksud Anda "melemparkan" integer sebagai string? Dan apa tepatnya yang dilakukan untuk menjawab pertanyaan yang tidak dijawab oleh yang lain?
Alex Hall
31

edit / perbarui: Xcode 11.4 • Swift 5.2

Silakan periksa komentar melalui kode


Isi file 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
    }
}

Anda juga perlu menambahkan ekstensi itu ke proyek Anda:


Isi file ekstensi UITextField.swift :

import UIKit
extension UITextField {
    var string: String { text ?? "" }
}

Isi file Extensions Formatter.swift :

import Foundation
extension Formatter {
    static let decimal = NumberFormatter(numberStyle: .decimal)
}

Isi file NumberFormatter.swift ekstensi :

import Foundation
extension NumberFormatter {
    convenience init(numberStyle: Style) {
        self.init()
        self.numberStyle = numberStyle
    }
}

Isi file StringProtocol.swift ekstensi :

extension StringProtocol where Self: RangeReplaceableCollection {
    var digits: Self { filter(\.isWholeNumber) }
    var integer: Int? { Int(self) }
}

Proyek sampel

Leo Dabus
sumber
27

Anda bisa menggunakannya NSNumberFormatter().numberFromString(yourNumberString). Ini bagus karena mengembalikan opsional yang kemudian dapat Anda uji dengan if letuntuk menentukan apakah konversi berhasil. misalnya.

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
}

Cepat 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
  }
Abaho Katabarwa
sumber
1
Saya baru saja mengubahnya ke 'myNumber.integerValue' karena Xcode 7 tidak akan membangun dengan 'intValue'. Yang terakhir adalah nilai Int32
brainray
21

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

Anda juga bisa menggunakan Binding Opsional selain dari penjilidan paksa.

misalnya:

  if let number = Int(stringNumber) { 
   // number is of type Int 
  }
OOMMEN
sumber
14

// Xcode 8.1 dan swift 3.0

Kami juga dapat mengatasinya dengan Binding Opsional, Cukup

let occur = "10"

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

    }
Pankaj Nigam
sumber
11

Di Swift 4.2 dan 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)
iOS
sumber
Mengenai: Int (string)! jika string tidak ada, Int? opsional akan nol dan kemudian membuka bungkus nol opsional akan mengakibatkan crash
jcpennypincher
7

Cepat 3

Cara paling sederhana dan lebih aman adalah:

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

Hindari nilai yang tidak valid pengaturan jenis keyboard ke papan angka:

 textFieldA.keyboardType = .numberPad
 textFieldB.keyboardType = .numberPad
sangat buruk
sumber
7

Dalam Swift 4:

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

saya telah membuat program sederhana, di mana Anda memiliki 2 bidang txt Anda mengambil input dari pengguna dan menambahkannya untuk membuatnya lebih mudah dimengerti, silakan cari kode di bawah ini.

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

semoga ini membantu.

AliRaza Qureshi
sumber
4

Swift 3.0

Coba ini, Anda tidak perlu memeriksa kondisi apa pun yang saya lakukan semuanya cukup gunakan fungsi ini. Kirim string, angka, float, dobel, dll. Anda mendapatkan angka sebagai nilai atau 0 jika tidak dapat mengkonversi nilai Anda

Fungsi:

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
}

Penggunaan: Tambahkan fungsi di atas dalam kode dan untuk mengonversi penggunaan let myNumber = getNumber(number: myString) jika myStringmemiliki nomor atau string yang mengembalikan nomor yang dikembalikannya0

Contoh 1:

let number:String = "9834"
print("printing number \(getNumber(number: number))")

Keluaran: printing number 9834

Contoh 2:

let number:Double = 9834
print("printing number \(getNumber(number: number))")

Keluaran: printing number 9834

Contoh 3:

let number = 9834
print("printing number \(getNumber(number: number))")

Keluaran: printing number 9834

Koushik
sumber
4

Berguna untuk String ke Int dan tipe lainnya

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

Gunakan seperti:

"123".toInt() // 123
Viral Savaliya
sumber
3

Tentang int () dan Swift 2.x: jika Anda mendapatkan nilai nol setelah konversi, periksa apakah Anda mencoba mengonversi string dengan angka besar (misalnya: 1073741824), dalam hal ini coba:

let bytesInternet : Int64 = Int64(bytesInternetString)!
Alessandro Ornano
sumber
1
Terima kasih ini berhasil untuk kasus saya. Int () bekerja untuk saya dengan 16 angka tetapi baru-baru ini mulai gagal.
Ryan Boyd
3

Swift3 terbaru kode ini hanya untuk mengkonversi string ke int

let myString = "556"
let myInt = Int(myString)
shim
sumber
2

Karena string mungkin berisi karakter non-numerik, Anda harus menggunakan a guarduntuk melindungi operasi. Contoh:

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

useLabelInt()
RonTLV
sumber
2

Saya baru saja mendapat masalah yang sama. Solusi di bawah ini berfungsi untuk saya:

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

Gunakan ini:

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

ATAU

Jadikan UITextField KeyboardType Anda sebagai DecimalTab dari XIB atau storyboard Anda, dan hapus kondisi apa pun untuk melakukan perhitungan apa pun, misalnya.

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

Karena jenis keyboard adalah DecimalPad, tidak ada peluang untuk memasukkan 0-9 atau yang lain.

Semoga bantuan ini !!

Narendar Singh Saini
sumber
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);
Jenny
sumber
1

Ini bekerja untuk saya

var a:Int? = Int(userInput.text!)
Naishta
sumber
Bagaimana ini berbeda dari solusi yang diberikan dalam komentar?
Pangkas
2
Solusi yang diberikan dalam komentar tidak ada "!" pada akhirnya, yang diharapkan dalam Swift 2 dan seterusnya
Naishta
1

untuk Swift3.x

extension String {
    func toInt(defaultValue: Int) -> Int {
        if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
            return n
        } else {
            return defaultValue
        }
    }
}
DàChún
sumber
0

untuk solusi alternatif. Anda dapat menggunakan ekstensi tipe asli. Anda dapat menguji dengan taman bermain.

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

"2" .add (1)

Durul Dalkanat
sumber
0

Solusi saya adalah memiliki ekstensi umum untuk konversi string ke 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  
        }
    }

}
nyala3
sumber
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
}
Krunal
sumber
0

Pertanyaan: string "4.0000" tidak dapat dikonversi menjadi integer menggunakan Int ("4.000")?

Jawab: Int () periksa string bilangan bulat atau tidak jika ya maka beri Anda bilangan bulat dan sebaliknya nihil. tetapi Float atau Double dapat mengonversi string nomor apa saja ke Float atau Double masing-masing tanpa memberikan nihil. Contoh jika Anda memiliki string integer "45" tetapi menggunakan Float ("45") memberi Anda nilai float 45,0 atau menggunakan Double ("4567") memberi Anda 45,0.

Solusi: NSString (string: "45.000"). IntegerValue atau Int (Float ("45.000")!)! untuk mendapatkan hasil yang benar.

Ravi Kumar
sumber
0

Int in Swift berisi penginisialisasi yang menerima String. Ia mengembalikan Int opsional? karena konversi dapat gagal jika string tidak mengandung angka.

Dengan menggunakan pernyataan if let, Anda dapat memvalidasi apakah konversi berhasil.

Jadi kode Anda menjadi seperti ini:

@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
    }
}
Patrick
sumber
0

Swift 5.0 dan Di Atas

Kerja

Dalam hal jika Anda membelah Stringitu menciptakan dua substringsdan bukan dua Strings. Metode ini di bawah ini akan memeriksa Anydan mengubahnya t0 NSNumbermudah untuk mengkonversi NSNumberke Int,Float apa yang pernah jenis data yang Anda perlu.

Kode Aktual

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

Pemakaian

if let hourVal = getNumber(number: hourStr) as? Int {

}

Lulus Stringuntuk memeriksa dan mengkonversi keDouble

Double(getNumber(number:  dict["OUT"] ?? 0)
Koushik
sumber
0

Swift5 float atau int string ke 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())
fzh
sumber
-1

Mulai dari 3 cepat , saya harus memaksakan #% @ saya! string & int dengan "!" kalau tidak, itu tidak akan berhasil.

Sebagai contoh:

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
Sam B
sumber
Tidak bisakah kamu melakukannya var counterInt = counter.map { Int($0) }? Di mana counterakan menjadiString?
Martin
@ Martin - Tidak? menjadikannya opsional dan dengan demikian menambahkan kata "opsional" ke string penghitung.
Sam B
IMHO, Anda seharusnya tidak memaksa membuka bungkusan opsional Anda. Lebih suka menggunakan guarddan if letpernyataan
Martin
-1

Konversi nilai String ke Integer di Swift 4

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