การแปลงสตริงเป็น Int ด้วย Swift


352

แอปพลิเคชั่นคำนวณการเร่งความเร็วโดยการป้อนความเร็วและเวลาเริ่มต้นและสุดท้ายและจากนั้นใช้สูตรเพื่อคำนวณการเร่งความเร็ว อย่างไรก็ตามเนื่องจากค่าในกล่องข้อความเป็นสตริงฉันจึงไม่สามารถแปลงให้เป็นจำนวนเต็มได้

@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

7
ยังไม่ได้ลอง แต่บางทีคุณสามารถโยนค่าเช่นvar answer1 = Int(txtBox1.text)
Daniel

หากสตริงคุณสมมติว่า "23.0" ดังนั้นหากคุณส่งไปที่ Int ("23.0") สตริงนั้นจะคืนค่าศูนย์สำหรับกรณีนี้คุณต้องส่งไปที่ Double / Float ก่อนแล้วจึงส่งไปยัง Int อีกครั้ง
Ariven Nadar

คำตอบ:


326

แนวคิดพื้นฐานโปรดทราบว่านี่ใช้งานได้เฉพาะใน 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
...

ขอบคุณงานนี้ อย่างไรก็ตามฉันมีปัญหาเนื่องจากฉันต้องการให้ตัวเลขรวมอยู่ด้วยเช่นกัน ขอบคุณอีกครั้ง.
Marwan Qasem

4
หากคุณต้องการทุ่น (และคุณต้องการให้ Double ไม่ใช่การลอย) toInt () จะไม่ทำเช่นนั้น คุณสามารถใช้จินตนาการและเอกสารที่มีอยู่เพื่อค้นหาฟังก์ชั่นที่เหมาะสมได้หรือไม่?
gnasher729

4
'NSString' does not have a member named 'toInt'ฉันได้รับ ความคิดใด ๆ
Matej

1
NSStringและStringเป็นสองวัตถุที่แตกต่างกันและมีวิธีการที่แตกต่างกัน NSStringมีวิธีการที่เรียกว่า.intValue
Byron Coetsee

7
วิธีนี้เหมาะสำหรับ Swift เท่านั้นไม่ใช่ Swift2 ตอนนี้คุณควรใช้: Int (firstText.text)
gurehbgui

337

อัปเดตคำตอบสำหรับ swift 2.0 :

toInt()วิธีการจะได้รับข้อผิดพลาด เนื่องจากใน Swift 2.x .toInt()ฟังก์ชันถูกลบออกจาก String ในการแทนที่ Int ตอนนี้มี initializer ที่รับค่าสตริง:

let a:Int? = Int(firstText.text)     // firstText is UITextField  
let b:Int? = Int(secondText.text)   // secondText is UITextField

ฉันจะถามได้ไหมว่าทำไมฉันถึงได้รับข้อผิดพลาดเมื่อฉันไม่ใช้ '?' ถ่าน? ทำไมฉันต้องระบุ 'a' เป็นตัวเลือก?
Manos Serifios

1
@ManosSerifios การสนทนานี้อาจมีประโยชน์: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal

ไม่เกี่ยวข้องกันอย่างแท้จริง แต่วิธีการของคอนสตรัคเตอร์นั้นเป็นที่ต้องการเสมอ "\(someInt)"ไม่ดีString(someInt)อ่านง่ายกว่ามาก
ฮันนี่

ฉันกำลังพิมพ์Int(firstText.text)!และจากนั้นฉันยังเห็นตัวเลือก ทำไม? ฉันไม่ได้ปลดมันออกมาเหรอ?
ฮันนี่

nilนี้จะมีปัญหาเมื่อสตริง อาจไม่เกิดขึ้นเมื่อสตริงมาจากองค์ประกอบ UI เช่นในกรณีนี้ let a:Int? = Int(firstText.text ?? "")แต่วิธีหนึ่งที่จะป้องกันไม่ให้เกิดความผิดพลาดคือการเพิ่มค่าเริ่มต้นสตริง:
เจนส์

85

myString.toInt() - แปลงค่าสตริงเป็น int

สวิฟท์ 3.x

หากคุณมีจำนวนเต็มซ่อนอยู่ภายในสตริงคุณสามารถแปลงโดยใช้ตัวสร้างจำนวนเต็มเช่นนี้

let myInt = Int(textField.text)

เช่นเดียวกับชนิดข้อมูลอื่น ๆ (ลอยและดับเบิล) คุณยังสามารถแปลงโดยใช้ NSString:

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

1
นี้จริงตอบคำถามคนอื่น ๆ ทั้งหมดบอก OP วิธีการชายฝั่งจำนวนเต็มเป็นสตริงซึ่งไม่ใช่สิ่งที่เขาถาม
aremvee

1
ตัวอย่างสำหรับ Swift 3?
Peter Kreinz

กรุณาชี้แจง "ล่าสุดรุ่นสวิฟท์" สำหรับการขาดหวังว่าลูกหลานของความสับสน :)
อเล็กซ์ฮอลล์

@aremvee คุณหมายถึง "cast" จำนวนเต็มเป็นสตริงหรือไม่ และสิ่งนี้ทำอะไรเพื่อตอบคำถามที่คำตอบอื่นไม่ตอบ
Alex Hall

31

แก้ไข / อัปเดต: Xcode 11.4 • Swift 5.2

กรุณาตรวจสอบความคิดเห็นผ่านรหัส


เนื้อหาไฟล์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
    }
}

คุณจะต้องเพิ่มส่วนขยายเหล่านั้นในโครงการของคุณด้วย:


ส่วนขยายเนื้อหาไฟล์UITextField.swift :

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

ส่วนขยายของ Formatter.swiftเนื้อหาไฟล์:

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

ส่วนขยาย NumberFormatter.swiftเนื้อหาไฟล์:

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

ส่วนขยายเนื้อหาไฟล์StringProtocol.swift :

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

ตัวอย่างโครงการ


27

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
}

สวิฟท์ 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
  }

1
ฉันเพิ่งเปลี่ยนเป็น 'myNumber.integerValue' เนื่องจาก Xcode 7 จะไม่สร้างด้วย 'intValue' หลังมีค่า Int32
brainray

21

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 
  }

14

// Xcode 8.1 และ swift 3.0

นอกจากนี้เรายังสามารถจัดการได้โดยการผูกหรือเลือกก็ได้

let occur = "10"

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

    }

11

ใน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)

7

สวิฟท์ 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

ในสวิฟต์ 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)"
}

หวังว่านี่จะช่วยได้


4

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


4

มีประโยชน์สำหรับ 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

3

เกี่ยวกับ int () และ Swift 2.x: หากคุณได้รับค่าศูนย์หลังจากตรวจสอบการแปลงถ้าคุณพยายามแปลงสตริงด้วยตัวเลขจำนวนมาก (เช่น: 1073741824) ในกรณีนี้ลอง:

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
ขอบคุณสำหรับกรณีของฉัน Int () ทำงานให้ฉันด้วยตัวเลข 16 หลัก แต่เมื่อไม่นานมานี้เริ่มล้มเหลว
Ryan Boyd

3

swift3 ล่าสุดรหัสนี้เป็นเพียงการแปลงสตริงเป็น int

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

2

เนื่องจากสตริงอาจมีอักขระที่ไม่ใช่ตัวเลขคุณควรใช้guardเพื่อป้องกันการดำเนินการ ตัวอย่าง:

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

useLabelInt()

2

ฉันเพิ่งได้รับปัญหาเดียวกัน วิธีแก้ปัญหาด้านล่างใช้ได้สำหรับฉัน:

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

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 หรือกระดานเรื่องราวของคุณและลบเงื่อนไขใด ๆ สำหรับการคำนวณเช่น

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

เนื่องจากประเภทแป้นพิมพ์คือ DecimalPad จึงไม่มีโอกาสที่จะป้อน 0-9 หรืออื่น ๆ

หวังว่าความช่วยเหลือนี้ !!



1

มันใช้งานได้สำหรับฉัน

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

สิ่งนี้แตกต่างจากโซลูชันที่ให้ไว้ในความคิดเห็นหรือไม่
พรุน

2
วิธีแก้ปัญหาที่ระบุในความคิดเห็นหายไป "!" ในตอนท้ายซึ่งคาดว่าใน Swift 2 เป็นต้นไป
Naishta

1

สำหรับ Swift3.x

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

0

สำหรับโซลูชั่นทางเลือก คุณสามารถใช้ส่วนขยายประเภทเนทิฟ คุณสามารถทดสอบกับสนามเด็กเล่น

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

"2" .add (1)


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

คำถาม: สตริง "4.0000" ไม่สามารถแปลงเป็นจำนวนเต็มโดยใช้ Int ("4.000") ได้หรือไม่

Answer: Int () สตริงการตรวจสอบเป็นจำนวนเต็มหรือไม่ถ้าใช่แล้วให้จำนวนเต็มและมิฉะนั้นไม่มี แต่ Float หรือ Double สามารถแปลงสตริงตัวเลขใด ๆ ให้เป็น Float หรือ Double ที่เกี่ยวข้องโดยไม่ต้องให้ค่าใด ๆ ตัวอย่างถ้าคุณมีสตริงจำนวนเต็ม "45" แต่การใช้ Float ("45") จะให้ค่า 45.0 เป็นทศนิยมหรือใช้ Double ("4567") ให้ 45.0

วิธีแก้ปัญหา: NSString (สตริง: "45.000"). integerValue หรือ Int (ลอยตัว ("45.000")!)! เพื่อให้ได้ผลลัพธ์ที่ถูกต้อง


0

Int in Swift มี initializer ที่รับสตริง มันจะส่งกลับค่า 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

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

Swift5 float หรือ int string ถึง 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())

-1

จาก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

ทำvar counterInt = counter.map { Int($0) }ไม่ได้เหรอ counterจะเป็นที่ไหนString?
มาร์ติน

@ มาร์ติน - ไม่ ทำให้เป็นตัวเลือกและเพิ่มคำว่า "ไม่จำเป็น" ให้กับตัวนับ
Sam B

IMHO คุณไม่ควรฝืนตัวเลือกของคุณ ชอบการใช้งานguardและif letแถลงการณ์
มาร์ติน

-1

แปลงค่าสตริงเป็นจำนวนเต็มใน Swift 4

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.