在 Swift 中向 Int 中添加千分隔符

我是相当新的斯威夫特和有一个很大的麻烦,找到一个办法添加一个空间作为一千分隔符。

我希望实现的是将计算结果显示在一个文本字段中,以便格式如下:

2358000

而不是

2358000

比如说。

我不确定是应该格式化 Int 值,然后将其转换为 String,还是应该在将 Int 值转换为 String 之后添加空格。如果你能帮忙,我将不胜感激。

54077 次浏览

您可以使用 NSNumberFormatter 指定不同的分组分隔符,如下所示:

更新: 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"

如果您需要使用当前区域设置或固定区域设置将您的值显示为货币:

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

用法:

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"

注意: 如果您希望有一个与句点宽度相同的空格,可以使用 "\u{2008}"

Unicode 空间

formatter.groupingSeparator = "\u{2008}"

你想使用 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"

利奥 · 达布斯的回答翻译成了 Swift 3:

进入任何 .swift文件,离开类:

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

用法:

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

在 Swift 5中,当需要格式化数字显示时,NumberFormatter是正确的工具。


NumberFormatter有一个名为 numberStyle的属性。可以将 numberStyle设置为值 NumberFormatter.Style.decimal,以便将格式化程序的样式设置为十进制。

因此,在最简单的情况下,当您想要格式化一个十进制样式的数字时,您可以使用以下 Playground 代码:

import Foundation


let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal


let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))

根据用户当前的语言环境,该代码将为 在美国打印 Optional("2,358,000"),为 Fr _ FR打印 Optional("2 358 000")


请注意,下面的代码片段使用了设置为 Locale.currentNumberFormatterlocale属性,它等效于以前的 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))

下面使用 NumberFormattergroupingSeparator属性设置为 Locale.current.groupingSeparator的 Playground 代码也等同于前者:

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

否则,如果您希望使用特定的区域设置格式样式设置数字格式,可以使用以下 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")

然而,如果你真正想要的是强制执行一个特定的分组分隔符,你可以使用下面的 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")

试试这个

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

电话:

addPoints(inputNumber: "123456")

结果是:

123456(或123456)

我在找一种货币格式,比如 $100.000.00 我像这样定制了 Leo Dabus 的实现

extension Formatter {
static let withSeparator: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyGroupingSeparator = ","
formatter.locale = Locale(identifier: "en_US") //for USA's currency patter
return formatter
}()
}


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

密码:

//5000000
let formatter = NumberFormatter()
formatter.groupingSeparator = " "
formatter.locale = Locale(identifier: "en_US")
formatter.numberStyle = .decimal.

产出:

5000000