Formation PUB900 : Développer une application pour iPhone avec SwiftUI, H-2024 Le langage Swift (référence)

61.3 L'interpolation de chaînes (interprétation d'une variable dans une chaîne)


Il est possible de demander à Swift d'interpréter une variable ou une constante à l'intérieur d'une chaîne de caractères. Cette technique s'appelle l'interpolation de chaîne de caractères ou, en anglais, string interpolation.

Je vous propose de comparer l’interpolation de chaîne à une simple conversion de type, puis d’aborder les différentes méthodes de formatage des nombres en Swift et en SwiftUI.

Dans cette fiche :

Conversion de type

Si vous avez besoin d'une simple conversion de type, par exemple de changer un nombre en chaîne de caractères, vous pouvez utiliser le constructeur de la structure String.

Swift

let valeur:Int = 3

Text(String(valeur))

Interpolation de chaîne

Dans sa forme la plus simple, l’interpolation permet elle aussi de convertir une valeur en chaîne de caractères.

Swift

let valeur:Int = 3

Text("\(valeur)")

L'interpolation de chaîne est cependant beaucoup plus puissante.

Elle permet notamment de créer une chaîne qui contient des variables.

On place la variable ou la constante dans la chaîne entre parenthèses, précédées d’une barre oblique inverse (\).

SwiftUI

let nom: String = "Annie"
Text("Bonjour \(nom)")

Format des nombres (paramètre specifier)

Dans le cas d'un nombre avec décimales, l'interpolation crée également une chaîne tout en permettant de préciser le format attendu.

Par exemple, pour arrondir le nombre à deux décimales à l'aide de l'interpolation de chaîne :

SwiftUI

let montant: Double = 10

Text("Montant: \(montant, specifier: "%.2f") $")

Le paramètre de style %f est une syntaxe héritée de l'Objective-C.

Notez que le paramètre specifier n’est disponible qu'à l'intérieur d'un Text. 

Ceci ne fonctionnera pas :

SwiftUI

let texte = "Montant: \(montant, specifier: "%.2f") $"

Format des nombres (paramètre format)

Depuis iOS 15, sorti en 2021, le paramètre format permet lui aussi de spécifier le format d'un nombre.

Avec ceci, on obtiendra le même résultat qu'avec Text("Montant: \(montant, specifier: "%.2f") $")

SwiftUI

Text("Montant: \(montant, format: .currency(code: "CAD"))")

Le paramètre format peut également être utilisé en dehors d'un Text.

SwiftUI

let texte = String(format: "Montant: %.2f $", montant)

ou, en utilisant l'interpolation de chaîne :

SwiftUI

let texte = "Montant: \(String(format: "%.2f", montant)) $"

NumberFormatter

Pour obtenir plus de contrôle sur le format des nombres, il est possible de travailler avec la classe NumberFormatter.

Le format attendu sera précisé dans la méthode init() du ContentView. 

Ici, on aura un signe monétaire avec deux décimales.

SwiftUI

struct ContentView: View {
  ...
  let format: NumberFormatter


  init() {

    format = NumberFormatter()
    format.numberStyle = .currency
    format.maximumFractionDigits = 2
  }

  var body: some View {
    ...
    Text("Prix : \(prix as NSNumber, formatter: format)")
    ...
  }
}

Il est également possible d'utiliser cette syntaxe abrégée dans laquelle le format attendu est précisé dès l'instanciation du NumberFormatter.

J'ai utilisé ici des styles différents afin d'illustrer d'autres possibilités.

Ce format tiendra compte de la localisation. Par exemple, si on est en français du Canada, le séparateur de décimales sera une virgule et il n'y aura pas de séparateur de milliers.

SwiftUI

struct ContentView: View {
  ...
  let format: NumberFormatter = {
    let numberFormatter = NumberFormatter()
    numberFormatter.locale = Locale.current // ou forcer la localisation avec numberFormatter.locale = Locale(identifier: "fr_CA")
    return numberFormatter

  }()

 

  var body: some View {
    ...
    Text("Points : \(points as NSNumber, formatter: format)")
    ...
  }
}

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre