在 SwiftUI 中,NumberFormatter 是一个非常强大的工具,用于将数字格式化为字符串,或将字符串转换为数字。它提供了多种定制选项,如设置小数点的精度、千位分隔符、货币格式等,非常适用于数字显示和用户输入的处理。
import Foundation
extension Double {
func formattedWithTwoDecimalPlaces() -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
return formatter.string(from: NSNumber(value: self)) ?? "0.00"
}
}
在SwiftUI中调用该方法,可以实现保留两位小数和千分位分割的效果:

下面是常用的方法、属性和用法。
常用方法
NumberFormatter 是一个非常强大的类,用于将数字格式化为字符串,或者将字符串转换为数字。它提供了很多方法和属性来定制数字的格式,下面是一些常用的 NumberFormatter 方法和属性。
1、string(from:)
用于将数字(如 NSNumber 或 Double)格式化为字符串。
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let formattedString = formatter.string(from: NSNumber(value: 1234.56))
print(formattedString) // 输出: "1,234.56" (取决于 Locale)
2、number(from:)
将格式化的字符串转换为 NSNumber 对象。这通常用于解析用户输入的数字。
let formatter = NumberFormatter()
let number = formatter.number(from: "1,234.56")
print(number) // 输出: 1234.56
3、setLocalizedFormatFromTemplate(_:)
设置格式化样式,使用本地化的数字格式。可以指定模板来自动设置数字格式。
let formatter = NumberFormatter()
formatter.setLocalizedFormatFromTemplate("Currency")
let formattedString = formatter.string(from: NSNumber(value: 1234.56))
print(formattedString) // 输出: "$1,234.56" (根据地区不同会有差异)
4、getObjectValue(_:for:)
用于将格式化的字符串转换为数字类型。如果转换失败,它会返回 nil。
let formatter = NumberFormatter()
var number: NSNumber?
let success = formatter.getObjectValue(&number, for: "1,234.56")
print(success) // 输出: true
print(number) // 输出: 1234.56
常用属性
1、numberStyle
设置数字的样式,可以控制数字的显示方式。常见的值包括:
.decimal: 普通数字格式(带小数点和千位分隔符)
.currency: 货币格式
.percent: 百分比格式
.scientific: 科学计数法格式
.spellOut: 数字单词形式(例如:“one thousand two hundred thirty-four”)
.ordinal: 序数格式(例如:“1st”, “2nd”)
.none: 没有任何格式
let formatter = NumberFormatter()
formatter.numberStyle = .currency
2、locale
设置区域,用于根据不同的地区显示不同的数字格式(例如,使用不同的小数点和千位分隔符)。
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US") // 设置为美国的区域
3、maximumFractionDigits
设置小数部分的最大位数。
let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2 // 最多保留两位小数
4、minimumFractionDigits
设置小数部分的最小位数。即使数字本身没有小数部分,输出也会强制显示指定的小数位数。
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 2 // 始终保留两位小数
5、minimumIntegerDigits
设置整数部分的最小位数。如果整数部分的位数不足,数字前面会补充零。
let formatter = NumberFormatter()
formatter.minimumIntegerDigits = 5 // 最少显示 5 位整数部分,前面补零
6、maximumIntegerDigits
设置整数部分的最大位数。如果整数部分超过该位数,会被截断。
let formatter = NumberFormatter()
formatter.maximumIntegerDigits = 5 // 最大显示 5 位整数部分
7、groupingSeparator
获取或设置千位分隔符(通常是 , 或 .,取决于区域设置)。
let formatter = NumberFormatter()
print(formatter.groupingSeparator) // 输出当前区域的千位分隔符,例如 ","
8、currencySymbol
设置货币符号,默认是基于区域的符号(例如美元符号 $)。
let formatter = NumberFormatter()
formatter.currencySymbol = "€" // 将货币符号设置为欧元符号
9、percentSymbol
设置百分号符号(%),默认为区域相关的百分号符号。
let formatter = NumberFormatter()
formatter.percentSymbol = "%" // 可以定制百分号
10、roundingMode
设置数字的四舍五入模式。常见的选项包括:
.halfUp(四舍五入)
.down(向下取整)
.up(向上取整)
.halfEven(四舍六入)
let formatter = NumberFormatter()
formatter.roundingMode = .halfUp // 四舍五入
11、currencyGroupingSeparator
设置货币的千位分隔符(例如,“.” 或 “,”)。根据区域设置,它会自动调整。
let formatter = NumberFormatter()
formatter.currencyGroupingSeparator = ","
代码示例
可以使用 NumberFormatter 来格式化数字为字符串。比如,可以将一个 Double 格式化为货币、保留指定小数位数的浮动小数,或者加上千位分隔符。
import SwiftUI
struct ContentView: View {
let number = 1234567.89
var body: some View {
Text(formatNumber(number))
.font(.largeTitle)
}
func formatNumber(_ value: Double) -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal // 使用千位分隔符
formatter.minimumFractionDigits = 2 // 保留两位小数
formatter.maximumFractionDigits = 2 // 最多保留两位小数
return formatter.string(from: NSNumber(value: value)) ?? ""
}
}
总结
NumberFormatter 是一个非常强大且灵活的工具,用于格式化数字和字符串,在 SwiftUI 中广泛应用于显示金额、百分比、日期和其他数字类型。可以通过设置其 numberStyle 属性和其他格式化选项来定制输出格式,支持各种显示方式(如货币、百分比、科学计数法等)。
相关文章
SwiftUI保留两位小数和千分位分隔符:https://fangjunyu.com/2025/01/08/swiftui%e4%bf%9d%e7%95%99%e4%b8%a4%e4%bd%8d%e5%b0%8f%e6%95%b0%e5%92%8c%e5%8d%83%e5%88%86%e4%bd%8d%e5%88%86%e9%9a%94%e7%ac%a6/