自定义 FormatStyle
发布
更新
字数
321
阅读
2 分钟
阅读量
616
使用 FormStyle
格式化文本非常方便,我们可以通过自定义 FormStyle
实现更多实用的格式化方法。
先看一下已有的 FormStyle
使用方法:
// 格式化日期
print(Date.now.formatted(.dateTime.month().year().day().minute().hour()))
// 2023年3月25日 19:45
注意上面的格式化顺序,会自动本地化,例如在英文化境下会 输出为 MMMM d, yyyy HH:mm
的样式。
现在我们定义一个简单的 FormatStyle
,需求是:自动格式化容积为 ml。
// 定义一个数字格式化,配置小数的处理方式
extension NumberFormatter {
static let volumeFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.maximumFractionDigits = 1
formatter.minimumFractionDigits = 0
return formatter
}()
}
// 创建格式化风格
struct VolumeStyle: FormatStyle {
// 格式化方法
func format(_ value: Double) -> String {
let formatter = NumberFormatter.volumeFormatter
return "\(formatter.string(from: NSNumber(value: value)) ?? "0") ml"
}
}
// 添加扩展
extension FormatStyle where Self == VolumeStyle {
static var volume: VolumeStyle {
return VolumeStyle()
}
}
// 应用
1234.567.formatted(.volume)
// 1,234.57 ml
这是比较简单的方法,单位是硬编码的。为了转换单位、运算、比较等功能,可以创建一个 Volume
结构体,包含容积值和单位。
更多知识可以参考: WWDC 20 Formatter 让数据人性化:https://developer.apple.com/videos/play/wwdc2020/10160/ 自定义 format style:https://emptytheory.com/2021/08/14/creating-custom-parseable-format-styles-in-ios-15/