Obtenir la valeur entière de la chaîne en swift

135

Donc je peux faire ceci:

var stringNumb: NSString = "1357"

var someNumb: CInt = stringNumb.intValue

Mais je ne trouve pas le moyen de le faire avec String. J'aimerais faire quelque chose comme:

var stringNumb: String = "1357"

var someNumb: Int = Int(stringNumb)

Cela ne fonctionne pas non plus:

var someNumbAlt: Int = myString.integerValue
Logan
la source
1
var someNumb: Int? = Int(stringNumb)ouvar someNumb = Int(stringNumb)
SwiftArchitect

Réponses:

179

Swift 2.0 vous pouvez initialiser Integer à l'aide du constructeur

var stringNumber = "1234"
var numberFromString = Int(stringNumber)
Buru
la source
14
Depuis Swift 2.0, vous n'avez plus la toInt()méthode dans le cadre de String. Ce Intconstructeur est donc désormais le seul moyen de convertir des chaînes en entiers.
Morgan Wilde
1
Le point-virgule n'est pas nécessaire
Sebastian
Pouvez-vous s'il vous plaît dire comment gérer si l'utilisateur entre un nombre supérieur à un nombre limite Int64 dans le champ de texte
Khushboo Dhote
1
@Sebastian n'est-ce pas frustrant? :)
Victor
94

J'utiliserais:

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

Remarque toInt():

Si la chaîne représente un entier qui tient dans un Int, renvoie l'entier correspondant.

CW0007007
la source
5
Cela a fonctionné, bien que si vous déclarez explicitement le var, vous devez ajouter un point d'exclamation: var someNumb: Int = stringNumber.toInt()!comme @NateCook l'a souligné
Logan
Je ne le déclare pas explicitement. Le compilateur sait que numberFromString devrait être un int car il est initialisé en tant que un ...
CW0007007
Je sais que tu ne l'es pas, mais je le suis. J'ai dû faire cet ajustement pour le faire. Votre code est correct, il suffit de l'ajouter en commentaire.
Logan
Oui, il ne renvoie une valeur que si la valeur s'inscrit dans un Int comme l'indique la note. Sinon, il renvoie nil ...
CW0007007
5
Au lieu de mettre !l'appel, vous pouvez déclarer votre variable en option: someNumb: Int? = stringNumber.toInt(). Ensuite, le système de sécurité de type sera conscient qu'il foopeut ne pas exister. La mise !plantera bien sûr si votre chaîne ne peut pas être convertie en nombre.
gwcoffey
18

Dans Swift 3.0

Type 1: convertir NSString en chaîne

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

Type 2: si la chaîne a uniquement un entier

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

Type 3: si la chaîne a une valeur flottante

    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
la source
Le code pour "Type 3" n'est pas idéal. Au lieu de vérifier stringToFloatest != nil, vous devriez utiliser if let.
rmaddy
11

La méthode que vous voulez est toInt()- vous devez être un peu prudent, car le toInt()retourne un Int facultatif.

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
la source
mais de même, toInt()est la bonne façon de le faire. les options font partie intégrante de la langue
Jiaaro
Bien sûr, vous devez juste être conscient que vous travaillez avec un Int optionnel, pas un Int.
Nate Cook
5

Si vous pouvez utiliser NSStringuniquement un fichier.

C'est assez similaire à objective-c. Tous les types de données sont là mais nécessitent l' as NSStringajout

    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

Nous avons également toInt()ajouté une fonction Voir Apple Inc. «Le langage de programmation Swift». iBooks. https://itun.es/us/jEUH0.l page 49

x.toInt()
John Riselvato
la source
oublié d'ajouter le as NSString. fixed it @gwcoffey
John Riselvato
2
Je ne veux pas utiliser NSString, voir la question.
Logan
4

La réponse ci-dessus ne m'a pas aidé car la valeur de ma chaîne était "700,00"

avec Swift 2.2 cela fonctionne pour moi

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

J'ai passé myInt à NSFormatterClass

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

let priceValue = formatter.stringFromNumber(myInt!)!

//Now priceValue is700

Merci à ce billet de blog.

swiftBoy
la source
1
Cette question concerne l'obtention d'un entier à partir d'une chaîne. Dans votre cas, vous n'avez pas d'Int, vous avez un Double. Dans Swift, utilisez simplement Double()la même manière que nous utilisons Int(). Pas besoin d'utiliser le pontage vers NSString.
Eric Aya
Hey @EricD merci pour votre suggestion mais " Je voulais Integer uniquement car je passe Int à la classe NSNumberFormatter pour le convertisseur de devises".
swiftBoy
1
Eh bien, dans ce cas, vous pouvez utiliser Double() puis utiliser Int(). Comme ça: if let d = Double("700.00") { let i = Int(d); print (i) }:)
Eric Aya
2

Vous pouvez passer de String à NSString et convertir de CInt en Int comme ceci:

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

J'ai écrit une extension à cet effet. Il renvoie toujours un fichier Int. Si la chaîne ne rentre pas dans un Int, 0 est renvoyé.

extension String {
    func toTypeSafeInt() -> Int {
        if let safeInt = self.toInt() {
            return safeInt
        } else {
            return 0
        }
    }
}
timo-haas
la source
2
Cela peut être écrit plus succinctement comme return self.toInt() ?? 0. Il est probablement préférable de l'écrire de cette façon en ligne plutôt que d'avoir une méthode d'extension pour cela.
jlong64
0

Une solution plus générale pourrait être une extension

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

ceci, par exemple, étend l'objet String natif swift de toFloat

loopmasta
la source
0

Convertissez String en Int dans Swift 2.0:

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

utilisation .intergerValue or intValue for Int32

Pablo Ruan
la source
0

Cotes 8: 1 (*)

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

ou

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

Int(String)renvoie un optionnel Int?, pas un Int.


Utilisation sûre: ne pas déballer explicitement

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

ou

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

(*) Aucune des réponses n'indiquait pourquoi cela var someNumb: Int = Int(stringNumb)ne fonctionnait pas.

SwiftArchitect
la source
Merci @ user3441734. Je n'aurais pas dû utiliser le casting .
SwiftArchitect
0

Façon simple mais sale

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

La voie d'extension

C'est vraiment mieux, car il jouera bien avec les paramètres régionaux et les décimales.

extension String {

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

Maintenant, vous pouvez simplement faire:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue
Kevin R
la source