Convertir Int en chaîne dans Swift


554

J'essaie de trouver un moyen de lancer un Intdans StringSwift.

Je trouve une solution de contournement, en utilisant NSNumbermais j'aimerais savoir comment tout faire dans Swift.

let x : Int = 45
let xNSNumber = x as NSNumber
let xString : String = xNSNumber.stringValue

Réponses:


961

Conversion Inten String:

let x : Int = 42
var myString = String(x)

Et l'inverse - conversion Stringen Int:

let myString : String = "42"
let x: Int? = myString.toInt()

if (x != nil) {
    // Successfully converted String to Int
}

Ou si vous utilisez Swift 2 ou 3:

let x: Int? = Int(myString)

2
Pendant que cela fonctionne, utilisez la toStringfonction indiquée dans une réponse ci-dessous.
ybakos

2
Intne semble pas avoir une toString()méthode du moins pas dans l'édition Xcode 6.2: je vois qu'il y a une toStringméthode globale ( pas Int.toString() ), quelqu'un sait-il l'avantage d'utiliser le String()constructeur?
Nilloc

Notez que String(Int?)écrit "Facultatif (Int)", au moins dans Swift 2, ce ne pouvait pas être ce que vous vouliez dire. Utilisez à la placeInt?.description
Teejay

Merveilleux, mais ne fonctionne pas pour moi. J'ai un Int facultatif, et String (myInt) ne compilera pas - il prétend "Int? Ne peut pas être converti en String". Aucune méthode toString () ou toInt () n'est disponible pour moi non plus, ou stringValue et intValue ne sont pas là. Même une chaîne (myInt!) Me dira que l'initialiseur a été renommé en quelque chose comme String (décrivant: myInt!).
Motti Shneor

9
Pour Swift 4, voir la réponse de Hamed Gh ci-dessous. L'utilisation correcte estString(describing: x)
David Gay

92

Vérifiez la réponse ci-dessous:

let x : Int = 45
var stringValue = "\(x)"
print(stringValue)

45
meh, c'est une solution de contournement laide et inutile quand Stringun constructeur accepte déjàInt
Gabriele Petronella

3
quel mal vous trouvez cela? pourquoi avez-vous mis le vote? @GabrielePetronella
PREMKUMAR

2
c'est juste une façon terrible d'atteindre le résultat souhaité. La réponse est cependant techniquement correcte, et pour cette raison, je n'ai pas voté contre.
Gabriele Petronella

Je ne pense pas que ce soit particulièrement moche, sauf que certains outils d'analyse peuvent ne pas gérer correctement l'interpolation de chaînes. Sinon, qui sait - cela pourrait être plus rapide. Utiliser "" + x en Javascript est généralement plus rapide que d'utiliser un constructeur String, par exemple. Cet exemple n'est que de quelques caractères plus court, mais je préférerais certainement l'interpolation de chaînes dans les cas où vous construisiez une phrase à partir de plusieurs variables.
Desty

1
Je ne voterais pas contre cette réponse simplement parce que c'est moche, mais comme @GabrielePetronella l'a dit, il n'est pas nécessaire d'utiliser l'interpolation de chaîne quand Stringun constructeur accepte un Int. C'est beaucoup plus clair et concis.
Isuru du

58

Voici 4 méthodes:

var x = 34
var s = String(x)
var ss = "\(x)"
var sss = toString(x)
var ssss = x.description

Je peux imaginer que certaines personnes auront un problème avec les art. Mais si vous cherchez à construire une chaîne contenant un autre contenu, pourquoi pas.


5
Je viens de regarder une partie du nouveau cours de Stanford U sur Swift et iOS 8. Votre var ss = "\(x)"exemple est exactement la façon dont ils ont conseillé de convertir un double en chaîne. Ce que j'ai trouvé facile et génial.
Markhunte

Et penser plus à sass - c'est vraiment mauvais.
Ian Bradbury

2
toString a été renommé String
Jirson Tavera

1
s est maintenant (Swift 3.1) String (décrivant: x) l'ancienne syntaxe génère une erreur de compilation.
Motti Shneor

3
@MottiShneor Non, c'est faux. String(describing:)ne doit jamais être utilisé pour autre chose que le débogage. Ce n'est pas l'initialiseur de chaîne normal.
Eric Aya

55

Dans Swift 3.0 :

var value: Int = 10
var string = String(describing: value)

7
C'est faux. String(describing:)ne doit jamais être utilisé pour autre chose que le débogage. Ce n'est pas l'initialiseur de chaîne normal.
Eric Aya

Est-ce toujours faux dans Swift 5? @ayaio, car en se basant sur la documentation, cela ne semble pas faux
Zonily Jame

27

Swift 4 :

let x:Int = 45
let str:String = String(describing: x)

Developer.Apple.com> String> init (décrivant :)

L'initialiseur String (décrivant :) est le moyen préféré pour convertir une instance de n'importe quel type en chaîne.

Convertible de chaîne personnalisée

entrez la description de l'image ici


3
résultat Facultatif (1)
Harshil Kotecha

11
C'est faux. String(describing:)ne doit jamais être utilisé pour autre chose que le débogage. Ce n'est pas l'initialiseur de chaîne normal.
Eric Aya

3
Hamed Gh, Morithz fournit déjà la bonne réponse dans la même question vérifier ma réponse Utilisez simplement l'initialiseur String () normal. Mais ne lui donnez pas une option, déballez d'abord. Ou, comme dans votre exemple, utilisez ??. Comme ceci: let str = String (x ?? 0)
Harshil Kotecha

2
@HamedGh Regardez les exemples dans le lien que vous vous donnez. La describingméthode est là pour ... décrire son contenu. Il donne une description. Parfois, c'est la même chose que la conversion, parfois non . Donnez une option à describinget vous verrez le résultat ... Ce ne sera pas une conversion. Il existe un moyen simple et dédié de convertir: en utilisant l'initialiseur de chaîne normal, comme expliqué dans d'autres réponses. Lisez la page complète à laquelle vous liez: voyez que cette méthode recherche des descriptions en utilisant différentes manières, dont certaines donneraient des résultats erronés si vous vous attendez à une conversion précise.
Eric Aya

2
Vous devriez vraiment supprimer la partie descriptive de cette réponse. La conversion doit être effectuée sans utiliser de nom de paramètre dans le constructeur String.
TimTwoToes

26

Pour être complet, vous pouvez également utiliser:

let x = 10.description

ou toute autre valeur prenant en charge une description.


5
Cela a fonctionné pour moi lorsque j'essayais d'afficher la valeur dans une étiquette. Avec les autres approches, c'était toujours facultatif (0) au lieu de 0. Merci
Hardcore_Graverobber

11

Swift 4:

Essayer d'afficher la valeur dans l'étiquette sans le mot Facultatif () .

ici x est une valeur Int utilisant.

let str:String = String(x ?? 0)

3
Non. String(describing:)Ne doit jamais être utilisé pour autre chose que le débogage. Ce n'est pas l'initialiseur de chaîne normal.
Eric Aya

Bonjour @Moritz, que puis-je faire pour supprimer le mot facultatif? j'ai une valeur Int et que je veux imprimer dans l'étiquette
Harshil Kotecha

Utilisez simplement l' String()initialiseur normal . Mais ne lui donnez pas une option, déballez d'abord. Ou, comme dans votre exemple, utilisez ??. Comme ça:let str = String(x ?? 0)
Eric Aya

developer.apple.com/documentation/swift/string/2427941-init je comprends votre point de vue à quoi sert la description
Harshil Kotecha

C'est principalement à des fins de débogage. Vous pouvez décrire le nom des classes, obtenir la description des instances, etc. Mais il ne doit jamais être utilisé pour les chaînes utilisées dans l'application elle-même.
Eric Aya

8

Pour vous faire gagner du temps et des tracas à l'avenir, vous pouvez créer une extension Int. En général, je crée un fichier de code partagé dans lequel je mets des extensions, des énumérations et d'autres éléments amusants. Voici à quoi ressemble le code d'extension:

extension Int
{
    func toString() -> String
    {
        var myString = String(self)
        return myString
    }
}

Plus tard, lorsque vous souhaitez convertir un int en chaîne, vous pouvez simplement faire quelque chose comme:

var myNumber = 0
var myNumberAsString = myNumber.toString()

Question potentiellement stupide, mais devrait-il s'agir d'une fonction ou d'une variable calculée? Je ne me souviens pas lequel Swift utilise normalement dans ces cas - est-ce toIntou toInt().
Maury Markowitz

1
Pour vous faire gagner du temps et des tracas, utilisez simplement myNumber.description. Pas besoin d'extensions.
2017

8

dans swift 3.0 voici comment nous pouvons convertir Intvers Stringet StringversInt

//convert Integer to String in Swift 3.0

let theIntegerValue :Int = 123  // this can be var also
let theStringValue :String = String(theIntegerValue)


//convert String to Integere in Swift 3.0


let stringValue : String = "123"
let integerValue : Int = Int(stringValue)!

1
Dans la dernière ligne du code, pourquoi avons-nous besoin d'un point d'exclamation à la fin?
Omar Tariq

@OmarTariq, car nous indiquons explicitement au compilateur que le integerValuetype de est Int. ne peut alors pas avoir de valeur nulle. donc le compilateur vous dit de le déballer. si vous voulez éviter cela, utilisez-le comme let integerValue = Int(stringValue). alors vous n'aurez pas de problème. Désolé pour la réponse tardive.
Chanaka Caldera

1
@OmarTariq Le déballage dans ce cas peut être vraiment mauvais. Si la chaîne n'est pas un nombre, cela bloquera votre application. Vous devriez vraiment vérifier pour vous assurer qu'il est valide et ne pas forcer le déballage.
Charlie Fish

7

pour une raison quelconque, la réponse acceptée n'a pas fonctionné pour moi. Je suis allé avec cette approche:

var myInt:Int = 10
var myString:String = toString(myInt)

5

Plusieurs façons de procéder:

var str1:String="\(23)"
var str2:String=String(format:"%d",234)

4

Swift 2:

var num1 = 4
var numString = "56"
var sum2 = String(num1) + numString
var sum3 = Int(numString)

2

iam utilise cette approche simple

Chaîne en Int:

 var a = Int()
var string1 = String("1")
a = string1.toInt()

et de Int à String:

var a = Int()
a = 1
var string1 = String()
 string1= "\(a)"

2

Convertir Unicode Int en chaîne

Pour ceux qui souhaitent convertir un Int en une chaîne Unicode, vous pouvez effectuer les opérations suivantes:

let myInteger: Int = 97

// convert Int to a valid UnicodeScalar
guard let myUnicodeScalar = UnicodeScalar(myInteger) else {
    return ""
}

// convert UnicodeScalar to String
let myString = String(myUnicodeScalar)

// results
print(myString) // a

Ou bien:

let myInteger: Int = 97
if let myUnicodeScalar = UnicodeScalar(myInteger) {
    let myString = String(myUnicodeScalar)
}

@jvarela, cela fonctionne toujours. Je viens de le retester dans Xcode 8.2 (Swift 3.0.2). L' Stringinitialiseur peut prendre a UnicodeScalar.
Suragch


0

Pour convertir String en Int

var numberA = Int("10")

Print(numberA) // It will print 10

Pour convertir Int en chaîne

var numberA = 10

1ère voie)

print("numberA is \(numberA)") // It will print 10

2ème voie)

var strSomeNumber = String(numberA)

ou

var strSomeNumber = "\(numberA)"


0

Dans swift 3.0, vous pouvez changer un entier en chaîne comme indiqué ci-dessous

let a:String = String(stringInterpolationSegment: 15)

Une autre façon est

let number: Int = 15
let _numberInStringFormate: String = String(number)

// ou tout nombre entier à la place de 15


1
D'après la référence de l'API "N'appelez pas cet initialiseur directement. Il est utilisé par le compilateur lors de l'interprétation des interpolations de chaînes." Peut-être voulez-vous vérifier si vous l'utilisez quelque part.
Rahul Sharma

0

Je préfère utiliser l' interpolation de chaînes

let x = 45
let string = "\(x)"

Chaque objet a une représentation sous forme de chaîne. Cela simplifie les choses. Par exemple, si vous devez en créer Stringavec plusieurs valeurs. Vous pouvez également faire des calculs ou utiliser certaines conditions

let text = "\(count) \(count > 1 ? "items" : "item") in the cart. Sum: $\(sum + shippingPrice)"

0

Si vous aimez l'extension swift, vous pouvez ajouter le code suivant

extension Int
{
    var string:String {
        get {
            return String(self)
        }
    }
}

ensuite, vous pouvez obtenir une chaîne par la méthode que vous venez d'ajouter

var x = 1234
var s = x.string


-1
let intAsString = 45.description     // "45"
let stringAsInt = Int("45")          // 45
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.