Ajout D'un séparateur de milliers à Int dans Swift

je suis assez nouveau à Swift et avoir beaucoup de mal à trouver un moyen pour ajouter un espace comme séparateur de milliers.

Ce que j'espère accomplir est de prendre le résultat d'un calcul et l'afficher dans un champ de texte de sorte que le format est:

2 358 000

au lieu de

2358000

par exemple.

Je ne suis pas sûr si je dois formater la valeur Int et puis la convertir en une chaîne, ou ajouter l'espace après que la valeur Int est convertie en une chaîne. Toute aide serait grandement appréciée.

37
demandé sur Mick MacCallum 2015-05-02 08:59:57

5 réponses

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 disposer d'un espace avec la même largeur d'une période donnée, vous pouvez utiliser "\u{2008}"

unicode espaces

formatter.groupingSeparator = "\u{2008}"
83
répondu Leo Dabus 2017-09-25 20:32:48

vous voulez 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"
27
répondu Airspeed Velocity 2015-05-02 06:17:53

Avec Swift 3, lorsque vous avez besoin de formater l'affichage des numéros, NumberFormatter est le bon outil.


NumberFormatter possède une propriété appelée numberStyle. numberStyle peut être réglé à une valeur NumberFormatter.Style.decimal afin de définir le style du formatteur à la décimale.

par conséquent, dans le cas le plus simple où vous voulez formater un nombre avec le style décimal, Vous pouvez utiliser le code de terrain de jeu 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 l'utilisateur courant locale, ce code affichera Optional("2,358,000") en_US ou Optional("2 358 000") fr_FR.


Notez que l'extrait de code suivant utilise la NumberFormatterlocale propriété définie à Locale.current est l'équivalent du code de terrain de jeu 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 de terrain de jeu en dessous qui utilise le NumberFormattergroupingSeparator propriété définie à Locale.current.groupingSeparator est équivalent à la ancien:

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 voulez définir le formatage de nombre avec un style de formatage de locale spécifique, vous pouvez utiliser le code de terrain de jeu 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 ce que vous voulez vraiment est d'appliquer un séparateur de regroupement spécifique, vous pouvez utiliser le code de terrain de jeu 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")
8
répondu Imanou Petit 2017-04-28 07:25:29

la réponse de Leo Dabus traduit en Swift 3:

dans tout .swift le fichier de la 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)) ?? ""
    }
}

Utilisation:

let myInteger = 2358000
let myString = myInteger.stringWithSeparator  // "2 358 000"
6
répondu David Seek 2016-12-06 14:13:12

Essayez ceci

func addPoints(inputNumber: NSMutableString){
    var count: Int = inputNumber.length
    while count >= 4 {
        count = count - 3
        inputNumber.insert(" ", at: count) // you also can use "," 
    }
    print(inputNumber)
}

L'appel:

addPoints(inputNumber: "123456")

Le résultat:

123 456 (ou 123 456)

0
répondu Василий Синишин 2018-08-28 08:20:25