Быстро получить целочисленное значение из строки

135

Итак, я могу сделать это:

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 03

Ответы:

179

Swift 2.0 вы можете инициализировать Integer с помощью конструктора

var stringNumber = "1234"
var numberFromString = Int(stringNumber)
Буру
источник
14
Начиная с Swift 2.0 у вас больше нет toInt()метода как части String. Таким образом, Intтеперь этот конструктор - единственный способ преобразовать строки в целые числа.
Morgan Wilde,
1
Точка с запятой не обязательна
Себастьян
Не могли бы вы рассказать, как поступить, если пользователь вводит число, превышающее предельное число Int64 в текстовом поле
Khushboo Dhote
1
@ Себастьян, разве это не расстраивает? :)
Виктор
94

Я бы использовал:

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

Примечание toInt():

Если строка представляет собой целое число, которое вписывается в Int, возвращает соответствующее целое число.

CW0007007
источник
5
Это сработало, хотя, если вы явно объявите var, вам нужно добавить восклицательный знак: var someNumb: Int = stringNumber.toInt()!как указал @NateCook
Логан
Я не объявляю это явно. Компилятор знает, что numberFromString должно быть int, потому что оно инициализировано как единое целое ...
CW0007007, 03
Я знаю, что это не так, но я знаю. Я должен был сделать эту настройку, чтобы сделать это. Ваш код правильный, просто добавьте его в качестве комментария.
Logan
Да, он возвращает значение только в том случае, если значение вписывается в Int, как указано в примечании. В противном случае возвращается ноль ...
CW0007007 03
5
Вместо того , чтобы !на вызов, вы можете объявить переменную как опция: someNumb: Int? = stringNumber.toInt(). Тогда система безопасности типа будет знать, что fooможет не существовать. Ввод !, конечно же, выйдет из строя, если ваша строка не может преобразоваться в число.
gwcoffey 03
18

В Swift 3.0

Тип 1: преобразование NSString в строку

    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: если строка имеет значение с плавающей запятой

    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» не идеален. Вместо проверки stringToFloatis != 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()это правильный способ сделать это.
опционы
Конечно, вам просто нужно знать, что вы работаете с необязательным, а не с прямым Int.
Nate Cook
5

Если вы можете использовать NSStringтолько.

Это очень похоже на цель-с. Все типы данных есть, но требуют 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. «Язык программирования Swift». интерактивные книги. 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 is700

Благодаря этому сообщению в блоге.

swiftBoy
источник
1
Этот вопрос касается получения целого числа из String. В вашем случае у вас нет 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
        }
    }
}
Timo-Haas
источник
2
Это можно записать более кратко, как return self.toInt() ?? 0. Вероятно, лучше просто написать это таким образом, чем использовать метод расширения для этого.
jlong64
0

Более общим решением может быть расширение

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

это, например, расширяет быстрый собственный объект String на toFloat

loopmasta
источник
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?, а не файл Int.


Безопасное использование: не разворачивать явно

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

или

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

(*) Ни один из ответов на самом деле не объяснял, почему var someNumb: Int = Int(stringNumb)не работает.

SwiftArchitect
источник
Спасибо @ 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
Кевин Р
источник