Adding Thousand Separator to Int in Swift

后端 未结 7 1277
长发绾君心
长发绾君心 2020-11-30 05:17

I am fairly new to Swift and having a great deal of trouble finding a way to add a space as a thousand separator.

What I am hoping to achieve is taking the result

7条回答
  •  死守一世寂寞
    2020-11-30 06:11

    You can use NSNumberFormatter to specify a different grouping separator as follow:

    update: Xcode 11.5 • Swift 5.2

    extension Formatter {
        static let withSeparator: NumberFormatter = {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            formatter.groupingSeparator = " "
            return formatter
        }()
    }
    

    extension Numeric {
        var formattedWithSeparator: String { Formatter.withSeparator.string(for: self) ?? "" }
    }
    

    2358000.formattedWithSeparator  // "2 358 000"
    2358000.99.formattedWithSeparator  // "2 358 000.99"
    
    let int = 2358000
    let intFormatted = int.formattedWithSeparator  // "2 358 000"
    
    let decimal: Decimal = 2358000
    let decimalFormatted = decimal.formattedWithSeparator  // "2 358 000"
    
    let decimalWithFractionalDigits: Decimal = 2358000.99
    let decimalWithFractionalDigitsFormatted = decimalWithFractionalDigits.formattedWithSeparator // "2 358 000.99"
    

    If you need to display your value as currency with current locale or with a fixed locale:

    extension Formatter {
        static let number = NumberFormatter()
    }
    extension Locale {
        static let englishUS: Locale = .init(identifier: "en_US")
        static let frenchFR: Locale = .init(identifier: "fr_FR")
        static let portugueseBR: Locale = .init(identifier: "pt_BR")
        // ... and so on
    }
    extension Numeric {
        func formatted(with groupingSeparator: String? = nil, style: NumberFormatter.Style, locale: Locale = .current) -> String {
            Formatter.number.locale = locale
            Formatter.number.numberStyle = style
            if let groupingSeparator = groupingSeparator {
                Formatter.number.groupingSeparator = groupingSeparator
            }
            return Formatter.number.string(for: self) ?? ""
        }
        // Localized
        var currency:   String { formatted(style: .currency) }
        // Fixed locales
        var currencyUS: String { formatted(style: .currency, locale: .englishUS) }
        var currencyFR: String { formatted(style: .currency, locale: .frenchFR) }
        var currencyBR: String { formatted(style: .currency, locale: .portugueseBR) }
        // ... and so on
        var calculator: String { formatted(groupingSeparator: " ", style: .decimal) }
    }
    

    Usage:

    1234.99.currency    // "$1,234.99"
    
    1234.99.currencyUS  // "$1,234.99"
    1234.99.currencyFR  // "1 234,99 €"
    1234.99.currencyBR  // "R$ 1.234,99"
    
    1234.99.calculator  // "1 234.99"
    

    Note: If you would like to have a space with the same width of a period you can use "\u{2008}"

    unicode spaces

    formatter.groupingSeparator = "\u{2008}"
    

提交回复
热议问题