SwiftUI格式化数字的NumberFormatter
SwiftUI格式化数字的NumberFormatter

SwiftUI格式化数字的NumberFormatter

在 SwiftUI 中,NumberFormatter 是一个非常强大的工具,用于将数字格式化为字符串,或将字符串转换为数字。它提供了多种定制选项,如设置小数点的精度、千位分隔符、货币格式等,非常适用于数字显示和用户输入的处理。

例如扩展Double类型来格式化数字

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/

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注