在 Swift 中向 Int 添加千位分隔符
Posted
技术标签:
【中文标题】在 Swift 中向 Int 添加千位分隔符【英文标题】:Adding Thousand Separator to Int in Swift 【发布时间】:2015-05-02 05:59:57 【问题描述】:我对 Swift 还很陌生,并且很难找到一种方法来添加一个空格作为千位分隔符。
我希望实现的是获取计算结果并将其显示在文本字段中,格式为:
2 358 000
而不是
2358000
例如。
我不确定是否应该格式化 Int 值然后将其转换为字符串,或者在将 Int 值转换为字符串后添加空格。任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:您可以使用 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"
注意:如果你想有一个与句号宽度相同的空格,你可以使用"\u2008"
unicode spaces
formatter.groupingSeparator = "\u2008"
【讨论】:
不要设置分隔符,让格式化程序根据语言环境选择一个。 @Sulthan 没有语言环境会给他半角空间 你能帮我把这个添加到textField,怎么做?当我们输入文本字段数字应该改变(千后添加空格) @Аба-БакриИбрагимов ***.com/a/34294660/2303865【参考方案2】:你想使用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"
【讨论】:
我不知道法国(或任何国家,就此而言)使用空格作为分隔符。我最喜欢的风格一直是每 3 位数的空格,整数部分和小数部分之间的句点......我从一本旧数学书上捡到它,从未见过它在其他任何地方使用过......这正是法国人所做的吗? @ArtOfWarfare 许多语言使用逗号作为小数分隔符,但千位分隔符在空格和句点之间有所不同(例如,法语和德语使用空格,西班牙语和意大利语使用句点)。我认为英语是少数(可能是一种?)使用句点作为小数。 @AirspeedVelocity 实际上,在德语中,使用句点 (.) 作为千位分隔符和逗号 (,) 作为小数点分隔符。所以英语的 1,234.56 是德语的 1.234,56。 意大利:句点代表千 (1.000),逗号代表小数。这突出了让格式化程序格式化格式并自己格式化格式化程序的必要性。【参考方案3】:使用 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")
代表en_US 或Optional("2 358 000")
代表fr_FR。
请注意,使用NumberFormatter
的locale
属性设置为Locale.current
的以下代码sn-p 等效于前面的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))
下面使用NumberFormatter
的groupingSeparator
属性设置为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")
【讨论】:
【参考方案4】: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)) ?? ""
用法:
let myInteger = 2358000
let myString = myInteger.stringWithSeparator // "2 358 000"
【讨论】:
【参考方案5】:我正在寻找像 $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) ?? ""
【讨论】:
您应该在设置其他属性之前设置语言环境。顺便说一句,如果您将区域设置固定为“en_US”,则无需设置currencyGroupingSeparator。【参考方案6】:代码:
//5000000
let formatter = NumberFormatter()
formatter.groupingSeparator = " "
formatter.locale = Locale(identifier: "en_US")
formatter.numberStyle = .decimal.
输出:
5 000 000
【讨论】:
【参考方案7】:试试这个
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")
结果:
123 456(或 123,456)
【讨论】:
以上是关于在 Swift 中向 Int 添加千位分隔符的主要内容,如果未能解决你的问题,请参考以下文章