Je suis assez nouveau pour Swift et j'ai beaucoup de mal à trouver un moyen d'ajouter un espace comme mille séparateurs.
Ce que j'espère réaliser, c'est prendre le résultat d'un calcul et l'afficher dans un champ de texte pour que le format soit:
2 358 000
au lieu de
2358000
par exemple.
Je ne sais pas si je dois formater la valeur Int, puis la convertir en chaîne, ou ajouter l'espace après la conversion de la valeur Int en chaîne. Toute aide serait grandement appréciée.
Vous pouvez utiliser NSNumberFormatter pour spécifier un séparateur de regroupement différent comme suit:
mise à jour: Xcode 9 • Swift 4
extension Formatter {
static let withSeparator: NumberFormatter = {
let formatter = NumberFormatter()
formatter.groupingSeparator = " "
formatter.numberStyle = .decimal
return formatter
}()
}
extension BinaryInteger {
var formattedWithSeparator: String {
return Formatter.withSeparator.string(for: self) ?? ""
}
}
Xcode 8.3.2 • Swift 3.1
extension Formatter {
static let withSeparator: NumberFormatter = {
let formatter = NumberFormatter()
formatter.groupingSeparator = " "
formatter.numberStyle = .decimal
return formatter
}()
}
extension Integer {
var formattedWithSeparator: String {
return Formatter.withSeparator.string(for: self) ?? ""
}
}
let myInt = 2358000
let myIntString = myInt.formattedWithSeparator // "2 358 000"
Remarque: Si vous souhaitez avoir un espace de la même largeur d'une période, vous pouvez utiliser "\u{2008}"
formatter.groupingSeparator = "\u{2008}"
Vous souhaitez utiliser NSNumberFormatter
:
let fmt = NSNumberFormatter()
fmt.numberStyle = .DecimalStyle
fmt.stringFromNumber(2358000) // with my locale, "2,358,000"
fmt.locale = NSLocale(localeIdentifier: "fr_FR")
fmt.stringFromNumber(2358000) // "2 358 000"
Avec Swift 5, lorsque vous devez formater l'affichage des nombres, NumberFormatter
est le bon outil.
NumberFormatter
possède une propriété appelée numberStyle
. numberStyle
peut être défini sur une valeur de NumberFormatter.Style.decimal
afin de définir le style du formateur sur décimal.
Par conséquent, dans le cas le plus simple, lorsque vous souhaitez formater un nombre avec un style décimal, vous pouvez utiliser le code Playground suivant:
import Foundation
let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal
let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
Selon les paramètres régionaux actuels de l'utilisateur, ce code affichera Optional("2,358,000")
pour en_US ou Optional("2 358 000")
pour fr_FR .
Notez que l'extrait de code suivant qui utilise la propriété NumberFormatter
locale
définie sur Locale.current
Est équivalent au code Playground précédent:
import Foundation
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale.current
let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
Le code Playground ci-dessous qui utilise la propriété NumberFormatter
groupingSeparator
définie sur Locale.current.groupingSeparator
Est également équivalent à la première:
import Foundation
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.groupingSeparator = Locale.current.groupingSeparator
let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
Sinon, si vous souhaitez définir la mise en forme des nombres avec un style de mise en forme local spécifique, vous pouvez utiliser le code Playground suivant:
import Foundation
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "FR_fr")
let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
// prints: Optional("2 358 000")
Cependant, si vous voulez vraiment appliquer un séparateur de regroupement spécifique, vous pouvez utiliser le code Playground ci-dessous:
import Foundation
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.groupingSeparator = " "
let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
// prints: Optional("2 358 000")
La réponse de Leo Dabus traduite en Swift:
Dans n'importe quel .Swift
fichier, hors d'une classe:
struct Number {
static let withSeparator: NumberFormatter = {
let formatter = NumberFormatter()
formatter.groupingSeparator = " " // or possibly "." / ","
formatter.numberStyle = .decimal
return formatter
}()
}
extension Integer {
var stringWithSepator: String {
return Number.withSeparator.string(from: NSNumber(value: hashValue)) ?? ""
}
}
Usage:
let myInteger = 2358000
let myString = myInteger.stringWithSeparator // "2 358 000"