Chuyển đổi chuỗi thành Int với Swift


352

Ứng dụng về cơ bản tính toán gia tốc bằng cách nhập vận tốc và thời gian ban đầu và cuối cùng, sau đó sử dụng công thức để tính gia tốc. Tuy nhiên, vì các giá trị trong hộp văn bản là chuỗi, tôi không thể chuyển đổi chúng thành số nguyên.

@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
Chưa thử nhưng có lẽ bạn có thể sử dụng các giá trị nhưvar answer1 = Int(txtBox1.text)
Daniel

Nếu chuỗi của bạn giả sử là "23.0", thì nếu bạn chuyển nó thành Int ("23.0"), nó sẽ trả về nil, trong trường hợp này trước tiên bạn cần truyền sang Double / Float và sau đó lại chuyển sang Int.
Ariven Nadar

Câu trả lời:


326

Ý tưởng cơ bản, lưu ý rằng điều này chỉ hoạt động trong Swift 1.x (kiểm tra câu trả lời của ParaSara để xem cách nó hoạt động trong 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"
    }

Cập nhật cho Swift 4

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

Cảm ơn công việc này. Tuy nhiên, tôi có một vấn đề vì tôi cũng muốn các con số bao gồm cả số float. Cảm ơn một lần nữa.
Marwan Qasem

4
Nếu bạn cần phao (và bạn thực sự muốn Double, không nổi), toInt () sẽ không làm điều đó. Bạn có thể sử dụng trí tưởng tượng của bạn và các tài liệu có sẵn để tìm một chức năng phù hợp?
gnasher729

4
Tôi nhận được 'NSString' does not have a member named 'toInt'. Bất kỳ ý tưởng?
Matej

1
NSStringStringlà hai đối tượng khác nhau và có phương pháp khác nhau. NSStringcó một phương pháp được gọi là.intValue
Byron Coetsee

7
Giải pháp này chỉ phù hợp với Swift và không phù hợp với Swift2. Bây giờ bạn nên sử dụng: Int (firstText.text)
gurehbgui

337

Cập nhật câu trả lời cho swift 2.0 :

toInt()phương pháp được đưa ra một lỗi. Bởi vì, trong Swift 2.x, .toInt()chức năng đã bị xóa khỏi Chuỗi. Thay thế, Int hiện có một trình khởi tạo chấp nhận Chuỗi:

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

Tôi có thể hỏi tại sao tôi gặp lỗi khi tôi bỏ qua '?' char? Tại sao tôi cần phải nêu 'a' là một tùy chọn?
Manos Serifios

1
@ManosSerifios cuộc thảo luận này có thể hữu ích: stackoverflow.com/questions/32621022/iêu
Paraneetharan Saravanaperumal

không thực sự liên quan nhưng cách tiếp cận của hàm tạo luôn được ưa thích và dễ đọc hơn đối với Int to String. "\(someInt)"không tốt String(someInt)thì dễ đọc hơn nhiều
Honey

Tôi đang in Int(firstText.text)!và sau đó tôi vẫn thấy tùy chọn. Tại sao? Tôi đã không mở khóa nó?
Mật ong

Điều này sẽ sụp đổ khi chuỗi là nil. Không thể xảy ra khi chuỗi đến từ một thành phần UI như trong trường hợp này. Nhưng một cách để ngăn sự cố là thêm giá trị mặc định vào chuỗi : let a:Int? = Int(firstText.text ?? "").
Jens

85

myString.toInt() - chuyển đổi giá trị chuỗi thành int.

Swift 3.x

Nếu bạn có một số nguyên ẩn bên trong một chuỗi, bạn có thể chuyển đổi bằng cách sử dụng hàm tạo của số nguyên, như sau:

let myInt = Int(textField.text)

Cũng như các loại dữ liệu khác (Float và Double), bạn cũng có thể chuyển đổi bằng cách sử dụng NSString:

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

1
điều này thực sự trả lời cho câu hỏi, tất cả những người khác nói với OP cách tìm một Integer dưới dạng Chuỗi, đó không phải là điều anh ta đang hỏi
aremvee

1
Ví dụ cho Swift 3?
Peter Kreinz

vui lòng làm rõ "Phiên bản Swift mới nhất" cho sự thiếu hiểu biết của hậu thế :)
Alex Hall

@aremvee bạn có nghĩa là "đúc" một số nguyên dưới dạng một chuỗi? Và chính xác thì điều này làm gì mà trả lời câu hỏi mà các câu trả lời khác không có?
Alex Hall

31

chỉnh sửa / cập nhật: Xcode 11.4 • Swift 5.2

Vui lòng kiểm tra các ý kiến ​​thông qua mã


Nội dung tệp 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
    }
}

Bạn cũng cần thêm các phần mở rộng đó vào dự án của mình:


Phần mở rộng nội dung tệp UITextField.swift :

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

Phần mở rộng nội dung tệp Formatter.swift :

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

Phần mở rộng nội dung tệp NumberFormatter.swift :

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

Phần mở rộng nội dung tệp StringProtocol.swift :

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

Dự án mẫu


27

Bạn có thể sử dụng NSNumberFormatter().numberFromString(yourNumberString). Thật tuyệt vời vì nó trả về một tùy chọn mà sau đó bạn có thể kiểm tra if letđể xác định xem chuyển đổi có thành công hay không. ví dụ.

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
}

Swift 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
Tôi vừa đổi nó thành 'myNumber.integerValue' vì Xcode 7 sẽ không được xây dựng với 'intValue'. Cái sau có giá trị Int32
brainray

21

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

bạn cũng có thể sử dụng Binding tùy chọn ngoài ràng buộc bắt buộc.

ví dụ:

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

14

// Xcode 8.1 và swift 3.0

Chúng tôi cũng có thể xử lý nó bằng Binding tùy chọn, đơn giản

let occur = "10"

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

    }

11

Trong Swift 4.2Xcode 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)

Về: Int (chuỗi)! nếu chuỗi là nil, Int? tùy chọn sẽ là con số không và sau đó hủy bỏ con số không tùy chọn sẽ dẫn đến sự cố
jcpennypincher

7

Swift 3

Cách đơn giản và an toàn hơn là:

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

Tránh các giá trị không hợp lệ khi đặt loại bàn phím thành bàn phím số:

 textFieldA.keyboardType = .numberPad
 textFieldB.keyboardType = .numberPad

7

Trong Swift 4:

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

4

Tôi đã thực hiện một chương trình đơn giản, trong đó bạn có 2 trường txt bạn lấy mẫu người dùng nhập vào và thêm chúng để đơn giản hơn để hiểu xin vui lòng tìm mã bên dưới.

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

hi vọng điêu nay co ich.


4

Swift 3.0

Hãy thử điều này, bạn không cần kiểm tra bất kỳ điều kiện nào tôi đã làm mọi thứ chỉ cần sử dụng chức năng này. Gửi bất cứ điều gì chuỗi, số, float, double, vv ,. bạn nhận được một số là một giá trị hoặc 0 nếu nó không thể chuyển đổi giá trị của bạn

Chức năng:

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
}

Cách sử dụng: Thêm hàm trên vào mã và để chuyển đổi sử dụng let myNumber = getNumber(number: myString) nếu myStringcó một số hoặc chuỗi, nó trả về số khác mà nó trả về0

Ví dụ 1:

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

Đầu ra: printing number 9834

Ví dụ 2:

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

Đầu ra: printing number 9834

Ví dụ 3:

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

Đầu ra: printing number 9834


4

Hữu ích cho String to Int và loại khác

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

Sử dụng nó như:

"123".toInt() // 123

3

Giới thiệu về int () và Swift 2.x: nếu bạn nhận được giá trị không sau khi kiểm tra chuyển đổi nếu bạn cố gắng chuyển đổi một chuỗi có số lớn (ví dụ: 1073741824), trong trường hợp này hãy thử:

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
Cảm ơn bạn điều này đã làm việc cho trường hợp của tôi. Int () đã làm việc cho tôi với 16 chữ số nhưng gần đây đã bắt đầu thất bại.
Ryan Boyd

3

Swift3 mới nhất mã này chỉ đơn giản là để chuyển đổi chuỗi thành int

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

2

Bởi vì một chuỗi có thể chứa các ký tự không phải là số, bạn nên sử dụng một chuỗi guardđể bảo vệ thao tác. Thí dụ:

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

useLabelInt()

2

Gần đây tôi có vấn đề tương tự. Giải pháp dưới đây là công việc cho tôi:

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

1

Dùng cái này:

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

HOẶC LÀ

Đặt Loại bàn phím UITextField của bạn dưới dạng DecimalTab từ XIB hoặc bảng phân cảnh của bạn và xóa mọi điều kiện nếu thực hiện bất kỳ phép tính nào, nghĩa là.

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

Vì loại bàn phím là DecimalPad nên không có cơ hội nhập 0-9 khác.

Hy vọng điều này giúp đỡ !!


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);

1

Điều này làm việc cho tôi

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

Điều này khác với giải pháp được đưa ra trong bình luận như thế nào?
Prune

2
Giải pháp được đưa ra trong bình luận bị thiếu "!" vào cuối, dự kiến ​​trong Swift 2 trở đi
Naishta

1

cho Swift3.x

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

0

cho giải pháp thay thế. Bạn có thể sử dụng phần mở rộng một loại bản địa. Bạn có thể thử nghiệm với sân chơi.

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

"2" .add (1)


0

Giải pháp của tôi là có một phần mở rộng chung cho chuỗi chuyển đổi 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

Câu hỏi: chuỗi "4.0000" không thể chuyển đổi thành số nguyên bằng Int ("4.000")?

Trả lời: Chuỗi kiểm tra Int () có phải là số nguyên hay không nếu có thì cung cấp cho bạn số nguyên và nếu không thì không. nhưng Float hoặc Double có thể chuyển đổi bất kỳ chuỗi số nào thành Float hoặc Double tương ứng mà không cần đưa ra con số không. Ví dụ: nếu bạn có chuỗi số nguyên "45" nhưng sử dụng Float ("45") sẽ mang lại cho bạn giá trị float 45.0 hoặc sử dụng Double ("4567") mang lại cho bạn 45.0.

Giải pháp: NSString (chuỗi: "45.000"). IntegValue hoặc Int (Float ("45.000")!)! để có kết quả chính xác.


0

Một Int trong Swift chứa một trình khởi tạo chấp nhận Chuỗi. Nó trả về một Int tùy chọn? vì việc chuyển đổi có thể thất bại nếu chuỗi không chứa số.

Bằng cách sử dụng câu lệnh if let, bạn có thể xác thực xem chuyển đổi có thành công hay không.

Vì vậy, mã của bạn trở thành một cái gì đó như thế này:

@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 trở lên

Đang làm việc

Trong trường hợp nếu bạn đang tách Stringnó sẽ tạo ra hai substringschứ không phải hai Strings. Dưới đây phương pháp sẽ kiểm tra Anyvà chuyển đổi nó t0 NSNumberdễ dàng của nó để chuyển đổi một NSNumberđến Int, Floatnhững gì từng loại dữ liệu bạn cần.

Mã thực tế

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

Sử dụng

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

}

Vượt qua Stringđể kiểm tra và chuyển đổi sangDouble

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

0

Swift5 float hoặc int chuỗi thành 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

Kể từ swift 3 , tôi phải buộc #% @! chuỗi & int với dấu "!" nếu không thì nó không hoạt động.

Ví dụ:

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

Bạn không thể làm gì var counterInt = counter.map { Int($0) }? Nơi nào countersẽ là mộtString?
Martin

@Martin - Không? làm cho tùy chọn của nó và do đó thêm từ "tùy chọn" vào chuỗi truy cập.
Sam B

IMHO, bạn không nên ép buộc các tùy chọn của bạn. Thích sử dụng guardif lettuyên bố
Martin

-1

Chuyển đổi giá trị Chuỗi thành Số nguyên trong Swift 4

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.