数字和文本之间的转化是我们经常用到的,例如TextField只能是String的Bing(当然Xocode13 for iOS15/mac os 12以上已经支持其他格式)。

常用的转换形式

我们经常使用字符串格式说明符来更改格式,例如

1
2
3
4
5
6
7
import Foundation

var number = 123.239
var stringNumber = String(format: "%.2f", number)
print(stringNumber)

//输出 123.24

在SwiftUI的Text中我们也可以使用specifier来格式化显示的文本

1
Text("\(number, specifier: "%.2f")")

常用的数据格式

一般来说我会常用%.2f这种固定小数点位数的,代表小数点后固定两位。整数直接转基本没什么问题。麻烦就在于Double转String时,去除小数点后多余的0。例如使用%f会产生多余占位符,使用%g当数字很大时会用科学技术法表示。

1
2
3
4
5
6
var number: Double = 123212434234
var stringNumber = String(format: "%F", number)
var stringNumber2 = String(format: "%g", number)

print(stringNumber) //123212434234.000000
print(stringNumber2) //1.23212e+11

格式化数字

直接用format似乎不太行?除了这个方式还可以使用NumberFormatter来格式化数字。

我们新建一个函数

1
2
3
4
5
6
7
8
func doubleToString(num: Double) -> String {
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2
formatter.numberStyle = .decimal

return formatter.string(from: num as NSNumber) ?? "n/a"
}

使用这个函数来代替转换

1
2
3
var number: Double = 123212434234.12
var stringNumber3 = doubleToString(num: number)
print(stringNumber3) //123,212,434,234.12

可以获取一个自动省略小数点后面的0并且不会变成科学计数法的文本。

参考

Swift - How to remove a decimal from a float if the decimal is equal to 0?