ios - Agregar mil separadores a Int en Swift
separator (5)
Soy bastante nuevo en Swift y tengo muchos problemas para encontrar una manera de agregar un espacio como un separador de miles.
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 vez 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.
Con Swift 5, cuando necesita formatear la visualización de números,
NumberFormatter
es la herramienta adecuada.
NumberFormatter
tiene una propiedad llamada
numberStyle
.
numberStyle
se puede establecer en un valor de
NumberFormatter.Style.decimal
para establecer el estilo del formateador en decimal.
Por lo tanto, en el caso más simple cuando desea formatear un número con estilo decimal, puede usar el siguiente código de Playground:
import Foundation
let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal
let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
Según 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 configuración
locale
de
Locale.current
establecida en
Locale.current
es equivalente al código anterior de Playground:
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 siguiente código de Playground que usa la propiedad
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 número con un estilo de formato de configuración regional específico, puede usar el siguiente código de Playground:
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 siguiente código de Playground:
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")
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"
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)
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}"
formatter.groupingSeparator = "/u{2008}"