รับค่าจำนวนเต็มจากสตริงอย่างรวดเร็ว


136

ดังนั้นฉันสามารถทำได้:

var stringNumb: NSString = "1357"

var someNumb: CInt = stringNumb.intValue

แต่ฉันหาวิธีทำ w / a Stringไม่เจอ ฉันต้องการทำสิ่งที่ชอบ:

var stringNumb: String = "1357"

var someNumb: Int = Int(stringNumb)

สิ่งนี้ใช้ไม่ได้:

var someNumbAlt: Int = myString.integerValue

1
var someNumb: Int? = Int(stringNumb)หรือvar someNumb = Int(stringNumb)
SwiftArchitect

คำตอบ:


181

Swift 2.0คุณสามารถเริ่มต้นจำนวนเต็มโดยใช้ตัวสร้าง

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

14
ใน Swift 2.0 คุณไม่มีtoInt()วิธีการดังกล่าวเป็นส่วนหนึ่งของString. ดังนั้นตัวIntสร้างนี้จึงเป็นวิธีเดียวในการแปลงสตริงเป็น ints
Morgan Wilde

1
อัฒภาคไม่จำเป็น
เซบาสเตียน

คุณช่วยบอกวิธีจัดการได้ไหมหากผู้ใช้ป้อนหมายเลขเกินขีด จำกัด Int64 ในช่องข้อความ
Khushboo Dhote

1
@ เซบาสเตียนไม่หงุดหงิดเหรอ? :)
วิกเตอร์

94

ฉันจะใช้:

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

หมายเหตุtoInt():

ถ้าสตริงแทนจำนวนเต็มที่พอดีกับ Int ให้ส่งกลับจำนวนเต็มที่เกี่ยวข้อง


5
วิธีนี้ใช้ได้ผลแม้ว่าคุณจะประกาศ var อย่างชัดเจน แต่คุณต้องเพิ่มเครื่องหมายอัศเจรีย์: var someNumb: Int = stringNumber.toInt()!ตามที่ @NateCook ชี้ให้เห็น
Logan

ฉันไม่ได้ประกาศอย่างชัดเจน คอมไพเลอร์รู้ว่า numberFromString ควรเป็น int เพราะเริ่มต้นเป็นหนึ่ง ...
CW0007007

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

ใช่มันจะคืนค่าก็ต่อเมื่อค่านั้นพอดีกับ Int ตามที่โน้ตชี้ มิฉะนั้นจะส่งกลับศูนย์ ...
CW0007007

5
แทนที่จะวางในสายที่คุณสามารถประกาศตัวแปรของคุณเป็นตัวเลือก:! someNumb: Int? = stringNumber.toInt()จากนั้นระบบความปลอดภัยประเภทจะรับรู้ว่าfooอาจไม่มีอยู่จริง !แน่นอนว่าการใส่จะผิดพลาดหากสตริงของคุณไม่สามารถแปลงเป็นตัวเลขได้
gwcoffey

18

ใน Swift 3.0

ประเภทที่ 1: แปลง NSString เป็น String

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

ประเภทที่ 2: หากสตริงมีจำนวนเต็มเท่านั้น

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

แบบที่ 3: ถ้า String มีค่า 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"
    }

รหัสสำหรับ "ประเภท 3" ไม่เหมาะ แทนการตรวจสอบของstringToFloatมีที่คุณควรใช้!= nil if let
rmaddy

11

วิธีที่คุณต้องการคือtoInt()- คุณต้องระวังเล็กน้อยเนื่องจากtoInt()ส่งกลับค่า Int ที่เป็นทางเลือก

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

แต่ในทำนองเดียวกันtoInt()เป็นวิธีที่ถูกต้องที่จะทำ ตัวเลือกเป็นส่วนหลักของภาษา
Jiaaro

แน่นอนคุณต้องทราบว่าคุณกำลังทำงานกับทางเลือกไม่ใช่ Int ตรง
Nate Cook

5

หากคุณสามารถใช้ไฟล์NSString.

ค่อนข้างคล้ายกับวัตถุประสงค์ -c ประเภทข้อมูลทั้งหมดอยู่ที่นั่น แต่ต้องการการas NSStringเพิ่ม

    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

นอกจากนี้เรายังมีtoInt()ฟังก์ชันที่เพิ่มเข้ามาดู Apple Inc. “ The Swift Programming Language” iBooks https://itun.es/us/jEUH0.lหน้า 49

x.toInt()

ลืมเพิ่มไฟล์as NSString. แก้ไขแล้ว @gwcoffey
John Riselvato

2
ฉันไม่ต้องการใช้ NSString โปรดดูคำถาม
Logan

4

คำตอบข้างต้นไม่ได้ช่วยฉันเนื่องจากค่าสตริงของฉันคือ "700.00"

ด้วยSwift 2.2สิ่งนี้ใช้ได้กับฉัน

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

ฉันส่ง myInt ไปยัง NSFormatterClass

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

let priceValue = formatter.stringFromNumber(myInt!)!

//Now priceValue is ₹ 700

ขอขอบคุณที่นี้โพสต์บล็อก


1
คำถามนี้เกี่ยวกับการหาจำนวนเต็มจาก String ในกรณีของคุณคุณไม่มี Int คุณมี Double ในสวิฟท์เพียงแค่ใช้วิธีเดียวกับที่เรากำลังใช้Double() Int()ไม่จำเป็นต้องใช้ bridging กับ NSString
Eric Aya

สวัสดี @EricD ขอบคุณสำหรับคำแนะนำของคุณ แต่ " ฉันต้องการจำนวนเต็ม เมื่อฉันส่ง Int ไปยังคลาส NSNumberFormatter สำหรับตัวแปลงสกุลเงิน"
swiftBoy

1
ดีในกรณีนี้คุณสามารถใช้Double() แล้วInt()ใช้ แบบนี้if let d = Double("700.00") { let i = Int(d); print (i) }:)
Eric Aya

2

คุณสามารถเชื่อมโยงจาก String เป็น NSString และแปลงจาก CInt เป็น Int ได้ดังนี้:

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

1

ฉันเขียนส่วนขยายเพื่อจุดประสงค์นั้น มันจะส่งกลับIntไฟล์. หากสตริงไม่พอดีกับ an Intจะส่งคืน 0

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

2
return self.toInt() ?? 0นี้สามารถเขียนได้ชัดถ้อยชัดคำมากขึ้นเป็น มันอาจจะดีกว่าที่จะเขียนแบบนั้นแบบอินไลน์แทนที่จะมีวิธีการขยายสำหรับสิ่งนี้
jlong64

0

วิธีแก้ปัญหาทั่วไปอาจเป็นส่วนเสริม

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

ตัวอย่างนี้ขยายออบเจ็กต์สตริงเนทีฟที่รวดเร็วโดย toFloat



0

8: 1 ราคาต่อรอง (*)

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

หรือ

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

Int(String)ส่งคืนตัวเลือกInt?ไม่ใช่Intไฟล์.


การใช้งานอย่างปลอดภัย: อย่าแกะอย่างชัดเจน

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

หรือ

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

(*) ไม่มีคำตอบใดที่กล่าวถึงสาเหตุที่var someNumb: Int = Int(stringNumb)ใช้งานไม่ได้จริง


ขอบคุณ @ user3441734. ฉันไม่ควรจะใช้หล่อ
SwiftArchitect

0

วิธีง่ายๆ แต่สกปรก

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

ทางขยาย

สิ่งนี้ดีกว่าจริงๆเพราะมันจะเล่นได้ดีกับสถานที่และทศนิยม

extension String {

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

ตอนนี้คุณสามารถทำได้:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.