web-dev-qa-db-fra.com

Ajout de mille séparateurs à Int dans Swift

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.

45
alionthego

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

espaces unicode

formatter.groupingSeparator = "\u{2008}"
101
Leo Dabus

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

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é NumberFormatterlocale 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é NumberFormattergroupingSeparator 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")
16
Imanou Petit

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"
6
David Seek