Swift - 从Double中删除尾随零

时间:2015-04-10 11:51:08

标签: ios swift double trailing

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

var double = 3.0
var double2 = 3.10

println(func(double)) // 3
println(func(double2)) // 3.1

5 个答案:

答案 0 :(得分:45)

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

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

答案 1 :(得分:7)

在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) ?? "")
    }
}

答案 2 :(得分:2)

删除输出中的尾随零

当需要默认输出精度时,这种情况很好。我们测试可能的尾随零的值,并根据其使用不同的输出格式。

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”

使用最大小数位数进行格式化,不带零结尾

当需要自定义输出精度时,此方案很好。 此解决方案似乎与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”

答案 3 :(得分:1)

如果您正在寻找如何从字符串中删除尾随零:

string.replacingOccurrences(of: "0*$", with: "", options: .regularExpression)

这会将字符串“ 0.123000000”转换为“ 0.123”

答案 4 :(得分:0)

我找到的所有答案都很好,但都存在一些问题,例如在开始时生成没有 0 的十进制数(例如 .123 而不是 0.123)。但是这两个可以毫无问题地完成工作:

extension Double {
    func formatNumberWithFixedFraction(maximumFraction: Int = 8) -> String {
        let stringFloatNumber = String(format: "%.\(maximumFraction)f", self)
        return stringFloatNumber
    }
    
    func formatNumber(maximumFraction: Int = 8) -> String {
        let formatter = NumberFormatter()
        let number = NSNumber(value: self)
        formatter.minimumFractionDigits = 0
        formatter.maximumFractionDigits = maximumFraction
        formatter.numberStyle = .decimal
        formatter.allowsFloats = true
        let formattedNumber = formatter.string(from: number).unwrap
        return formattedNumber
    }
}

第一个将 maxFraction 为 8 的 71238.12 转换为:71238.12000000 但 maxFraction 为 8 的第二个将其转换为:71238.12