Швидко отримайте ціле значення з рядка


134

Тож я можу це зробити:

var stringNumb: NSString = "1357"

var someNumb: CInt = stringNumb.intValue

Але я не можу знайти спосіб, як це зробити 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

Відповіді:


179

Swift 2.0 ви можете ініціалізувати Integer за допомогою конструктора

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

14
Станом на Swift 2.0 цей toInt()метод вже не є частиною String. Тож цей Intконструктор тепер є єдиним способом перетворення рядків у ints.
Морган Уайльд

1
Точка з комою не потрібна
Себастьян

Скажіть, будь ласка, як поводитися, якщо користувач вводить число, що перевищує обмеження Int64, у текстовому полі
Khushboo Dhote

1
@Sebastian це не страшно? :)
Віктор

94

Я б використовував:

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

Примітка toInt():

Якщо рядок представляє ціле число, яке вписується в Int, повертає відповідне ціле число.


5
Це спрацювало, хоча якщо ви чітко оголосите var, вам потрібно додати знак оклику: var someNumb: Int = stringNumber.toInt()!як вказував @NateCook
Логан

Я не заявляю це прямо. Компілятор знає, що числоFromString має бути int, оскільки воно ініціалізовано як одне ...
CW0007007

Я знаю, що ти це не так, але я є. Я повинен був зробити це коригування, щоб зробити це. Ваш код правильний, просто додавши його як коментар.
Логан

Так, воно повертає значення лише тоді, коли значення вписується в 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: Якщо рядок має значення 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.
Нейт Кук

5

Якщо ви вмієте користуватися NSStringтільки.

Він досить схожий на Obje-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. "Мова швидкого програмування". iBooks. https://itun.es/us/jEUH0.l стор. 49

x.toInt()

забув додати as NSString. виправлено @gwcoffey
Джон Різельвато

2
Я не хочу використовувати NSString, див. Питання.
Логан

4

вище відповідь не допомогла мені, оскільки моє значення рядка було "700,00"

зі Swift 2.2 це працює для мене

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

Я передав мій текст в NSFormatterClass

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

let priceValue = formatter.stringFromNumber(myInt!)!

//Now priceValue is700

Завдяки цій публікації в блозі.


1
Це питання стосується отримання цілого числа з рядка. У вашому випадку ви не маєте Int, у вас є Double. У Swift просто використовуйте Double()той самий спосіб, який ми використовуємо Int(). Не потрібно використовувати мости до NSString.
Ерік Айя

Привіт @EricD дякую за вашу пропозицію, але " я хотів, щоб Integer був тільки тоді, як я передавав Int до класу NSNumberFormatter для конвертора валюти".
swiftBoy

1
Ну в цьому випадку ви можете використовувати Double() потім використовувати Int(). Ось так: if let d = Double("700.00") { let i = Int(d); print (i) }:)
Ерік Айя

2

Ви можете переходити з String до NSString і конвертувати з CInt в Int так:

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

1

Для цього я написав розширення. Він завжди повертає Int. Якщо рядок не вписується в Int, повертається 0.

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

2
Це можна записати більш лаконічно return self.toInt() ?? 0. Напевно, краще просто записати це таким чином inline, а не використовувати метод розширення для цього.
jlong64

0

Більш загальним рішенням може бути розширення

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

це, наприклад, розширює швидкий власний об'єкт String на toFloat


0

Перетворити String в Int у Swift 2.0:

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

використання .intergerValue or intValue for Int32


0

8: 1 Коефіцієнти (*)

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

або

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

Int(String)повертає необов’язково Int?, а не an 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.