Obtenga un valor entero de la cadena en Swift

134

Entonces puedo hacer esto:

var stringNumb: NSString = "1357"

var someNumb: CInt = stringNumb.intValue

Pero no puedo encontrar la manera de hacerlo w / a String. Me gustaría hacer algo como:

var stringNumb: String = "1357"

var someNumb: Int = Int(stringNumb)

Esto tampoco funciona:

var someNumbAlt: Int = myString.integerValue
Logan
fuente
1
var someNumb: Int? = Int(stringNumb)ovar someNumb = Int(stringNumb)
SwiftArchitect

Respuestas:

179

Swift 2.0 puede inicializar Integer usando el constructor

var stringNumber = "1234"
var numberFromString = Int(stringNumber)
Buru
fuente
14
A partir de Swift 2.0 ya no tienes el toInt()método como parte de String. Por lo tanto, este Intconstructor es ahora la única forma de convertir cadenas en ints.
Morgan Wilde
1
El punto y coma no es necesario
Sebastian
¿Puede decir cómo manejar si el usuario ingresa un número más que un número límite Int64 en el campo de texto
Khushboo Dhote
1
@Sebastian no es tan frustrante? :)
Victor
94

Yo usaría:

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

Nota toInt():

Si la cadena representa un número entero que cabe en un Int, devuelve el número entero correspondiente.

CW0007007
fuente
55
Esto funcionó, aunque si declara la var explícitamente, debe agregar un signo de exclamación: var someNumb: Int = stringNumber.toInt()!como señaló @NateCook
Logan
No lo estoy declarando explícitamente. El compilador sabe que numberFromString debería ser un int porque se inicializa como uno ...
CW0007007
Sé que no lo eres, pero yo sí. Tuve que hacer ese ajuste para hacerlo. Su código es correcto, solo agregándolo como comentario.
Logan
Sí, solo devuelve un valor si el valor se ajusta a un Int como señala la nota. De lo contrario, devuelve nulo ...
CW0007007
55
En lugar de poner !en la llamada, se puede declarar la variable como opcionales: someNumb: Int? = stringNumber.toInt(). Entonces, el tipo de sistema de seguridad será consciente de que foopuede no existir. Poner !, por supuesto, se bloqueará si su cadena no se puede convertir a un número.
gwcoffey
18

En Swift 3.0

Tipo 1: Convertir NSString a String

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

Tipo 2: si la cadena tiene solo entero

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

Tipo 3: si la cadena tiene valor flotante

    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"
    }
Rajamohan S
fuente
El código para "Tipo 3" no es ideal. En lugar de verificar stringToFloates != nil, debe usar if let.
rmaddy
11

El método que desea es toInt(): debe tener un poco de cuidado, ya que toInt()devuelve un Int opcional.

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
Nate Cook
fuente
pero de manera similar, toInt()es la forma correcta de hacerlo. los opcionales son una parte central del lenguaje
Jiaaro
Por supuesto, solo debes tener en cuenta que estás trabajando con un Int opcional, no directo.
Nate Cook
5

Si puede usar un NSStringsolo.

Es bastante similar al objetivo-c. Todos los tipos de datos están ahí pero requieren la as NSStringadición

    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

También tenemos una toInt()función agregada. Ver Apple Inc. "El lenguaje de programación Swift". iBooks https://itun.es/us/jEUH0.l página 49

x.toInt()
John Riselvato
fuente
olvidé agregar el as NSString. lo arregló @gwcoffey
John Riselvato
2
No quiero usar NSString, vea la pregunta.
Logan
4

la respuesta anterior no me ayudó ya que mi valor de cadena era "700.00"

con Swift 2.2 esto funciona para mí

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

Pasé myInt a NSFormatterClass

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

let priceValue = formatter.stringFromNumber(myInt!)!

//Now priceValue is700

Gracias a esta publicación de blog.

swiftBoy
fuente
1
Esta pregunta se trata de obtener un número entero de una cadena. En su caso, no tiene un Int, tiene un Double. En Swift, solo usa Double()la misma forma que nosotros Int(). No es necesario utilizar el puente a NSString.
Eric Aya
Hola @EricD, gracias por tu sugerencia, pero " quería Integer solo porque estoy transfiriendo Int a la clase NSNumberFormatter para el convertidor de divisas".
swiftBoy
1
Bueno, en este caso puedes usar y Double() luego usar Int(). Así: if let d = Double("700.00") { let i = Int(d); print (i) }:)
Eric Aya
2

Puede pasar de String a NSString y convertir de CInt a Int de esta manera:

var myint: Int = Int(stringNumb.bridgeToObjectiveC().intValue)
Connor
fuente
1

Escribí una extensión para ese propósito. Siempre devuelve un Int. Si la cadena no cabe en un Int, se devuelve 0.

extension String {
    func toTypeSafeInt() -> Int {
        if let safeInt = self.toInt() {
            return safeInt
        } else {
            return 0
        }
    }
}
timo-haas
fuente
2
Esto se puede escribir más sucintamente como return self.toInt() ?? 0. Probablemente sea mejor escribirlo de esa manera en línea en lugar de tener un método de extensión para esto.
jlong64
0

Una solución más general podría ser una extensión

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

esto, por ejemplo, extiende el objeto String nativo rápido por toFloat

loopmasta
fuente
0

Convertir String a Int en Swift 2.0:

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

utilizar .intergerValue or intValue for Int32

Pablo Ruan
fuente
0

Probabilidades 8: 1 (*)

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

o

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

Int(String)devuelve un opcional Int?, no un Int.


Uso seguro: no desenvolver explícitamente

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

o

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

(*) Ninguna de las respuestas realmente abordaba por qué var someNumb: Int = Int(stringNumb)no funcionaba.

Arquitecto Swift
fuente
Gracias @ user3441734. No debería haber usado el casting .
Arquitecto Swift
0

Manera simple pero sucia

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

El camino de extensión

Esto es mejor, realmente, porque jugará muy bien con configuraciones regionales y decimales.

extension String {

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

Ahora simplemente puedes hacer:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue
Kevin R
fuente