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 :
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.
let valeur:Int = 3
Text(String(valeur))
Dans sa forme la plus simple, l’interpolation permet elle aussi de convertir une valeur en chaîne de caractères.
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 (\).
let nom: String = "Annie"
Text("Bonjour \(nom)")
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 :
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 :
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") $")
Text("Montant: \(montant, format: .currency(code: "CAD"))")
Le paramètre format peut également être utilisé en dehors d'un Text.
let texte = String(format: "Montant: %.2f $", montant)
ou, en utilisant l'interpolation de chaîne :
let texte = "Montant: \(String(format: "%.2f", montant)) $"
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.
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.
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é