iOS 格式化浮点数时去掉末尾的 0

Dec 16, 2019 • 预计阅读时间 1 分钟

有时候需要把浮点数格式化为字符串显示到界面上,需要去掉末尾多余的 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

完全满足需求了

iOS
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

使用 Hugo v0.62 的渲染钩子(Render hooks)

运用 AutoLayout 的优先级例子