Agregar Mil Separadores a Int en Swift

Soy bastante nuevo en Swift y tengo muchos problemas para encontrar una forma de agregar un espacio como separador de mil.

Lo que espero lograr es tomar el resultado de un cálculo y mostrarlo en un campo de texto para que el formato sea:

2 358 000

en lugar de

2358000

por ejemplo.

No estoy seguro de si debería formatear el valor Int y luego convertirlo en una Cadena, o agregar el espacio después de que el valor Int se convierta en una Cadena. Cualquier ayuda sería muy apreciada.

Puede usar NSNumberFormatter para especificar un separador de agrupación diferente de la siguiente manera:

actualización: 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" 

Nota: si desea tener un espacio con el mismo ancho de un período, puede usar "\u{2008}"

espacios Unicode

 formatter.groupingSeparator = "\u{2008}" 

Desea usar 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" 

Con Swift 3, cuando necesite formatear la visualización de números, NumberFormatter es la herramienta correcta.


NumberFormatter tiene una propiedad llamada numberStyle . numberStyle se puede establecer en un valor de NumberFormatter.Style.decimal para establecer el estilo del formateador a decimal.

Por lo tanto, en el caso más simple cuando quiere formatear un número con estilo decimal, puede usar el siguiente código de Zona de juegos:

 import Foundation let formatter = NumberFormatter() formatter.numberStyle = NumberFormatter.Style.decimal let amount = 2358000 let formattedString = formatter.string(for: amount) print(String(describing: formattedString)) 

De acuerdo con la configuración regional actual del usuario, este código imprimirá Optional("2,358,000") para en_US u Optional("2 358 000") para fr_FR .


Tenga en cuenta que el siguiente fragmento de código que usa la propiedad de locale Locale.current establecida en Locale.current es equivalente al código de Playground anterior:

 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)) 

El código de Playground a continuación que utiliza la propiedad Locale.current.groupingSeparator de Locale.current.groupingSeparator establecida en Locale.current.groupingSeparator también es equivalente a la anterior:

 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)) 

De lo contrario, si desea establecer el formato de los números con un estilo de formato de configuración regional específico, puede usar el siguiente código de Zona de juegos:

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

Sin embargo, si lo que realmente desea es aplicar un separador de agrupación específico, puede usar el código de Playground a continuación:

 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 respuesta de Leo Dabus traducida a Swift 3 :

En cualquier archivo .swift , fuera de una clase:

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

Uso:

 let myInteger = 2358000 let myString = myInteger.stringWithSeparator // "2 358 000" 

Prueba esto

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

La llamada:

 addPoints(inputNumber: "123456") 

El resultado:

123 456 (o 123,456)