Swift - 从Double中删除尾随零

问题描述 投票:16回答:3

从双打中删除尾随零的函数是什么?

var double = 3.0
var double2 = 3.10

println(func(double)) // 3
println(func(double2)) // 3.1
ios swift double trailing
3个回答
47
投票

你可以这样做但它会返回一个字符串:

var double = 3.0
var double2 = 3.10

func forTrailingZero(temp: Double) -> String {
    var tempVar = String(format: "%g", temp)
    return tempVar
}

forTrailingZero(double)   //3
forTrailingZero(double2)  //3.1

9
投票

在Swift 4中你可以这样做:

extension Double {
    func removeZerosFromEnd() -> String {
        let formatter = NumberFormatter()
        let number = NSNumber(value: self)
        formatter.minimumFractionDigits = 0
        formatter.maximumFractionDigits = 16 //maximum digits in Double after dot (maximum precision)
        return String(formatter.string(from: number) ?? "")
    }
}

使用示例:print (Double("128834.567891000").removeZerosFromEnd())结果:128834.567891

您还可以计算字符串的小数位数:

import Foundation

extension Double {
    func removeZerosFromEnd() -> String {
        let formatter = NumberFormatter()
        let number = NSNumber(value: self)
        formatter.minimumFractionDigits = 0
        formatter.maximumFractionDigits = (self.components(separatedBy: ".").last)!.count
        return String(formatter.string(from: number) ?? "")
    }
}

3
投票

Removing trailing zeros in output

当需要默认输出精度时,此方案很好。我们测试潜在尾随零的值,并根据它使用不同的输出格式。

extension Double {
    var stringWithoutZeroFraction: String {
        return truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }
}

(也适用于extension Float,但不适用于Float80

输出:

1.0 → "1" 0.1 → "0.1" 0.01 → "0.01" 0.001 → "0.001" 0.0001 → "0.0001"

Formatting with maximum fraction digits, without trailing zeros

当需要自定义输出精度时,此方案很好。这个解决方案看起来和NumberFormatter + NSNumber solution from MirekE一样快,但有一个好处就是我们在这里避免使用NSObject。

extension Double {
    func string(maximumFractionDigits: Int = 2) -> String {
        let s = String(format: "%.\(maximumFractionDigits)f", self)
        for i in stride(from: 0, to: -maximumFractionDigits, by: -1) {
            if s[s.index(s.endIndex, offsetBy: i - 1)] != "0" {
                return String(s[..<s.index(s.endIndex, offsetBy: i)])
            }
        }
        return String(s[..<s.index(s.endIndex, offsetBy: -maximumFractionDigits - 1)])
    }
}

(也适用于extension Float,但不适用于Float80

maximumFractionDigits: 2的输出:

1.0 → "1" 0.12 → "0.12" 0.012 → "0.01" 0.0012 → "0" 0.00012 → "0"

© www.soinside.com 2019 - 2024. All rights reserved.