Swift - 从Double中删除尾随零

53

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

var double = 3.0
var double2 = 3.10

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

7
一个double本身不含有尾随零,只有它的字符串表示会有。可以查看NSNumberFormatter或者String(format:...)。这两种方法在这里的SO上应该已经有一些示例了。 - Martin R
你也可以像这个例子中使用numberFormatter:https://dev59.com/questions/IV0a5IYBdhLWcg3wJVzv#30664610 - wolffan
6个回答

83
你可以这样做,但它会返回一个字符串。
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

15
请注意,如果数字变得太大,"%g"格式将切换为科学计数法:"forTailingZero(123456789)== 1.23457e+08" :) - Martin R
11
我认为更优的解决方案在这个答案中有描述: https://dev59.com/IV0a5IYBdhLWcg3wJVzv#30664610 - Akshit Zaveri

63

在 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
它将“0.517”转换为“.517”,这可能不是一些人的要求。 - Sandeep Dhull
2
我认为在这种情况下,你可以直接使用“formatter.minimumIntegerDigits = 1”。 - Software Engineer

26

去除输出中的末尾零

当需要使用默认输出精度时,这种场景非常适用。我们测试该值是否存在潜在的末尾零,并根据不同情况使用不同的输出格式。

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”

使用最大分数位格式化,不包含尾随零

当需要自定义输出精度时,此场景非常好。这种解决方案似乎与MirekE的NumberFormatter + NSNumber 解决方案速度相近,但一个好处是我们避免了在这里使用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"

请注意它会进行四舍五入(与MirekE的解决方案相同):

0.9950000 → "0.99"
0.9950001 → "1"


maximumFractionDigits = 0 时,254.99998480081558 ==> "25" - hstdt

4

如果你正在寻找如何从字符串中删除末尾的零:

string.replacingOccurrences(of: "^([\d,]+)$|^([\d,]+)\.0*$|^([\d,]+\.[0-9]*?)0*$", with: "$1$2$3", options: .regularExpression)

这将把像“0.123000000”这样的字符串转换为“0.123”。

最简单的方法通常是最容易的。 - user-44651
如果输入是"63.00",输出结果将会是"63.",这是错误的。 - Saranjith

3

我找到的所有答案都不错,但是它们中的一些都存在问题,例如生成没有以 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
    }
}

第一个将小数点后最多保留8位的 71238.12 转换为: 71238.12000000,而第二个也是将 同样小数点后最多保留8位 的71238.12进行转换,结果为:71238.12

1

这个对我有用,将其作为String返回给文本标签

func ridZero(result: Double) -> String {
        let value = String(format: "%g", result)
        return value
}

以下是结果

ridZero(result: 3.0) // "3"
ridZero(result: 3.5) // "3.5"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接