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

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)

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.


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"
    }

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

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

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.


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)

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
        }
    }
}

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


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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.