在Swift中添加千位分隔符到Int

ali*_*ego 47 separator ios swift

我对Swift相当新,并且在寻找添加空间作为千分隔符的方法时遇到了很多麻烦.

我希望实现的是获取计算结果并将其显示在文本字段中,以便格式为:

2 358 000

代替

2358000

例如.

我不确定是否应该格式化Int值然后将其转换为String,或者在Int值转换为String后添加空格.任何帮助将不胜感激.

Leo*_*bus 109

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

更新:Xcode 9•Swift 4

extension Formatter {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = " "
        formatter.numberStyle = .decimal
        return formatter
    }()
}
Run Code Online (Sandbox Code Playgroud)

Xcode 8.3.2•Swift 3.1

extension Numeric {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)

注意:如果您希望使用具有相同宽度的空间,则可以使用 "\u{2008}"

unicode空间

extension Integer {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不要设置分隔符,让格式化程序根据区域设置选择一个. (21认同)
  • @Sulthan没有语言环境会给他一个半宽的空间 (2认同)

Air*_*ity 29

你想用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"
Run Code Online (Sandbox Code Playgroud)


Ima*_*tit 18

使用Swift 4.2,当您需要格式化数字显示时,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))
Run Code Online (Sandbox Code Playgroud)

根据用户的当前区域,这段代码将打印Optional("2,358,000")EN_USOptional("2 358 000")fr_FR时.


请注意,以下使用NumberFormatters locale属性设置的代码段Locale.current与以前的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))
Run Code Online (Sandbox Code Playgroud)

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

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))
Run Code Online (Sandbox Code Playgroud)

否则,如果要使用特定的区域设置格式样式设置数字格式,可以使用以下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")
Run Code Online (Sandbox Code Playgroud)

但是,如果您真正想要的是强制执行特定的分组分隔符,则可以使用下面的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")
Run Code Online (Sandbox Code Playgroud)


Dav*_*eek 6

Leo Dabus的答案翻译成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)) ?? ""
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let myInteger = 2358000
let myString = myInteger.stringWithSeparator  // "2 358 000"
Run Code Online (Sandbox Code Playgroud)