Swift - 从 Double 中删除尾随零

Posted

技术标签:

【中文标题】Swift - 从 Double 中删除尾随零【英文标题】:Swift - Remove Trailing Zeros From Double 【发布时间】:2015-06-16 03:09:57 【问题描述】:

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

var double = 3.0
var double2 = 3.10

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

【问题讨论】:

一个 double 没有尾随零,只有它的 字符串表示。看看NSNumberFormatterString(format: ...)。 SO上应该已经有一些例子了。 您也可以使用 numberFormatter,如本例所示:***.com/questions/30663996/… Swift - How to remove a decimal from a float if the decimal is equal to 0?的可能重复 【参考方案1】:

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

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

【讨论】:

请注意,如果数字太大,“%g”格式会切换为科学计数法:forTailingZero(123456789) == 1.23457e+08 :) 我认为这个答案描述了更优化的解决方案:***.com/a/30664610/2859764【参考方案2】:

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

【讨论】:

它将 "0.517" 转换为 ".517" 。这不是少数人的要求 我认为你可以在这种情况下使用“formatter.minimumIntegerDigits = 1”。【参考方案3】:

删除输出中的尾随零

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

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”

请注意,它执行舍入(与 MirekE 解决方案相同):

0.9950000 → “0.99” 0.9950001 → “1”

【讨论】:

maximumFractionDigits = 0, 254.99998480081558 ==> "25"【参考方案4】:

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

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

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

【讨论】:

最简单的方法通常是最简单的。 如果输入为“63.00”,输出将为“63”。这是错误的【参考方案5】:

我找到的所有答案都很好,但它们都有一些问题,比如在开始时生成没有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

【讨论】:

以上是关于Swift - 从 Double 中删除尾随零的主要内容,如果未能解决你的问题,请参考以下文章

如何从双精度中删除尾随零 [重复]

从Excel中删除尾随零并将小数点添加到字符串

如何从 Pandas 日期时间索引中删除尾随零(根据需要格式化)?

从 SQL Server 中的十进制中删除尾随零

如何从sqlplus中的数字列中删除小数点后的尾随零?

如何删除字符串中的前导零和尾随零? Python