有时候需要把浮点数格式化为字符串显示到界面上,需要去掉末尾多余的 0。
例如 108 * 0.95 希望界面上显示的结果为 102.6 而不是 102.600000
很简单,使用下面的方式进行格式化:
let str = String(format: "%g", 108 * 0.95)
这样得到 str
的值就是 102.6 而不是 102.600000
这个方法有一个坑,只能用来处理 4 位整数部分 + 2 位小数部分(AAAA.bb
)以内的浮点数。
如果超出范围则会丢失精度导致格式化的结果不符合预期。
例如:
NSLog("%g", 12345.678)
输出结果是:
12345.7
%g
表示以最短的方式来输出浮点数,如果科学计数法的形式更短则显示为科学计数法。
小写的 g
表示如果以科学计数法表示,那么使用小写的 e
。
还有 %lg
,%G
和 %lG
的写法。
大写的 G
表示以科学计数法表示时使用大写的 E
。
l
表示是 double 双精度浮点数。
以上是使用传统的格式化方法,由于存在精度问题所以不能完全满足实际项目中的需求。
使用 NumberFormatter
NumberFormatter 是基础库 Foudation 里提供的方法,专门用于格式化数字类型。
使用如下:
let nf = NumberFormatter()
nf.minimumFractionDigits = 0 // 至少保留几位小数,默认是 0
nf.maximumFractionDigits = 6 // 最大保留的小数位数,如果超出则对最后一位进行四舍五入
NSLog("\(nf.string(from: 10000000.123000)!)")
NSLog("\(nf.string(from: 10000000.123456)!)")
输出结果是:
10000000.123
10000000.123456
完全满足需求了