Nhận giá trị nguyên từ chuỗi trong swift


134

Vì vậy, tôi có thể làm điều này:

var stringNumb: NSString = "1357"

var someNumb: CInt = stringNumb.intValue

Nhưng tôi không thể tìm ra cách để làm điều đó String. Tôi muốn làm một cái gì đó như:

var stringNumb: String = "1357"

var someNumb: Int = Int(stringNumb)

Điều này cũng không hoạt động:

var someNumbAlt: Int = myString.integerValue

1
var someNumb: Int? = Int(stringNumb)hoặcvar someNumb = Int(stringNumb)
SwiftArchitect

Câu trả lời:


179

Swift 2.0 bạn có thể khởi tạo Integer bằng cách sử dụng hàm tạo

var stringNumber = "1234"
var numberFromString = Int(stringNumber)

14
Kể từ Swift 2.0, bạn không còn có toInt()phương thức như một phần của String. Vì vậy, hàm Inttạo này bây giờ là cách duy nhất để chuyển đổi chuỗi thành ints.
Morgan Wilde

1
Dấu chấm phẩy là không cần thiết
Sebastian

Bạn có thể vui lòng cho biết cách xử lý nếu người dùng nhập số nhiều hơn số giới hạn Int64 trong trường văn bản
Khushboo Dhote

1
@Sebastian không phải là bực bội? :)
Victor

94

Tôi sẽ sử dụng:

var stringNumber = "1234"
var numberFromString = stringNumber.toInt()
println(numberFromString)

Lưu ý toInt():

Nếu chuỗi đại diện cho một số nguyên phù hợp với một Int, trả về số nguyên tương ứng.


5
Điều này hoạt động, mặc dù nếu bạn khai báo var một cách rõ ràng, bạn cần thêm một dấu chấm than: var someNumb: Int = stringNumber.toInt()!như @NateCook đã chỉ ra
Logan

Tôi không tuyên bố rõ ràng. Trình biên dịch biết rằng numberFromString phải là một số nguyên vì nó được khởi tạo là một ...
CW0007007

Tôi biết rằng bạn không phải, nhưng tôi là. Tôi đã phải điều chỉnh để làm như vậy. Mã của bạn là chính xác, chỉ cần thêm nó như là một bình luận.
Logan

Có, nó chỉ trả về một giá trị nếu giá trị phù hợp với một Int như ghi chú chỉ ra. Nếu không, nó sẽ trả về ...
CW0007007

5
Thay vì thực !hiện cuộc gọi, bạn có thể khai báo biến của mình là tùy chọn : someNumb: Int? = stringNumber.toInt(). Sau đó, hệ thống an toàn loại sẽ được biết rằng foocó thể không tồn tại. Đặt !khóa học tất nhiên sẽ sụp đổ nếu chuỗi của bạn không thể chuyển đổi thành một số.
gwcoffey

18

Trong Swift 3.0

Loại 1: Chuyển đổi NSString thành Chuỗi

    let stringNumb:NSString = "1357"
    let someNumb = Int(stringNumb as String) // 1357 as integer

Loại 2: Nếu Chuỗi chỉ có Số nguyên

    let stringNumb = "1357"
    let someNumb = Int(stringNumb) // 1357 as integer

Loại 3: Nếu Chuỗi có giá trị Float

    let stringNumb = "13.57"
    if let stringToFloat = Float(stringNumb){
        let someNumb = Int(stringToFloat)// 13 as Integer
    }else{
       //do something if the stringNumb not have digit only. (i.e.,) let stringNumb = "13er4"
    }

Mã cho "Loại 3" không lý tưởng. Thay vì kiểm tra stringToFloat!= nil, bạn nên sử dụng if let.
rmaddy 17/07/17

11

Phương pháp bạn muốn là toInt()- bạn phải cẩn thận một chút, vì toInt()trả về một Int tùy chọn.

let stringNumber = "1234"
let numberFromString = stringNumber.toInt()
// numberFromString is of type Int? with value 1234

let notANumber = "Uh oh"
let wontBeANumber = notANumber.toInt()
// wontBeANumber is of type Int? with value nil

nhưng tương tự, toInt()là cách đúng đắn để làm điều đó. tùy chọn là một phần cốt lõi của ngôn ngữ
Jiaaro

Tất nhiên, bạn chỉ cần lưu ý rằng bạn đang làm việc với một tùy chọn, không phải là một Int thẳng.
Nate Cook

5

Nếu bạn có thể sử dụng NSStringchỉ.

Nó khá giống với mục tiêu-c. Tất cả các kiểu dữ liệu đều có nhưng yêu cầu as NSStringbổ sung

    var x = "400.0" as NSString 

    x.floatValue //string to float
    x.doubleValue // to double
    x.boolValue // to bool
    x.integerValue // to integer
    x.intValue // to int

Ngoài ra, chúng tôi có một toInt()chức năng được thêm vào Xem Apple Inc., Ngôn ngữ lập trình Swift. Sách điện tử. https://itun.es/us/jEUH0.l trang 49

x.toInt()

quên thêm as NSString. đã sửa nó @gwcoffey
John Riselvato

2
Tôi không muốn sử dụng NSString, xem câu hỏi.
Logan

4

câu trả lời trên không giúp tôi vì giá trị chuỗi của tôi là "700,00"

với Swift 2.2, nó hoạt động với tôi

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

Tôi đã chuyển myInt cho NSFormatterClass

let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.maximumFractionDigits = 0

let priceValue = formatter.stringFromNumber(myInt!)!

//Now priceValue is700

Nhờ bài viết trên blog này .


1
Câu hỏi này là về việc lấy một số nguyên từ Chuỗi. Trong trường hợp của bạn, bạn không có Int, bạn có Double. Trong Swift, chỉ cần sử dụng Double()cùng một cách chúng ta đang sử dụng Int(). Không cần sử dụng bắc cầu đến NSString.
Eric Aya

Xin chào @EricD cảm ơn lời đề nghị của bạn nhưng " Tôi chỉ muốn Integer khi tôi chuyển Int sang lớp NSNumberFormatter cho công cụ chuyển đổi tiền tệ".
swiftBoy

1
Vâng trong trường hợp này bạn có thể sử dụng Double() sau đó sử dụng Int(). Như thế này: if let d = Double("700.00") { let i = Int(d); print (i) }:)
Eric Aya

2

Bạn có thể chuyển từ String sang NSString và chuyển đổi từ CInt sang Int như thế này:

var myint: Int = Int(stringNumb.bridgeToObjectiveC().intValue)

1

Tôi đã viết một phần mở rộng cho mục đích đó. Nó luôn trả về một Int. Nếu chuỗi không khớp với một Int, 0 được trả về.

extension String {
    func toTypeSafeInt() -> Int {
        if let safeInt = self.toInt() {
            return safeInt
        } else {
            return 0
        }
    }
}

2
Điều này có thể được viết ngắn gọn hơn như return self.toInt() ?? 0. Có lẽ tốt hơn là chỉ viết nó theo cách nội tuyến hơn là có một phương thức mở rộng cho việc này.
jlong64

0

Một giải pháp tổng quát hơn có thể là một phần mở rộng

extension String {
    var toFloat:Float {
        return Float(self.bridgeToObjectiveC().floatValue)
    }
    var toDouble:Double {
        ....
    }
    ....
}

ví dụ này mở rộng đối tượng String gốc nhanh bằng toFloat


0

Chuyển đổi chuỗi thành Int trong Swift 2.0:

var str:NSString = Data as! NSString
var cont:Int = str.integerValue

sử dụng .intergerValue or intValue for Int32


0

Tỷ lệ 8: 1 (*)

var stringNumb: String = "1357"
var someNumb = Int(stringNumb)

hoặc là

var stringNumb: String = "1357"
var someNumb:Int? = Int(stringNumb)

Int(String)trả về một tùy chọn Int?, không phải là một Int.


Sử dụng an toàn: không rõ ràng

let unwrapped:Int = Int(stringNumb) ?? 0

hoặc là

if let stringNumb:Int = stringNumb { ... }

(*) Không có câu trả lời nào thực sự giải quyết var someNumb: Int = Int(stringNumb)được tại sao không hoạt động.


Cảm ơn bạn @ user3441734. Tôi không nên sử dụng đúc .
SwiftArchitect

0

Cách đơn giản nhưng bẩn thỉu

// Swift 1.2
if let intValue = "42".toInt() {
    let number1 = NSNumber(integer:intValue)
}
// Swift 2.0
let number2 = Int(stringNumber)

// Using NSNumber
let number3 = NSNumber(float:("42.42" as NSString).floatValue)

Đường mở rộng

Điều này tốt hơn, thực sự, bởi vì nó sẽ chơi độc đáo với các địa phương và số thập phân.

extension String {

    var numberValue:NSNumber? {
        let formatter = NSNumberFormatter()
        formatter.numberStyle = .DecimalStyle
        return formatter.numberFromString(self)
    }
}

Bây giờ bạn có thể chỉ cần làm:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue
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.