Swift -删除Double中的尾随零

mwyxok5s  于 2023-08-02  发布在  Swift
关注(0)|答案(6)|浏览(125)

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

var double = 3.0
var double2 = 3.10

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

字符串

5uzkadbs

5uzkadbs1#

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

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

字符串

hs1ihplo

hs1ihplo2#

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

fnatzsnv

fnatzsnv3#

删除输出中的尾随零

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

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”

lsmepo6l

lsmepo6l4#

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

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

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

cwtwac6a

cwtwac6a5#

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

zzzyeukh

zzzyeukh6#

这一个对我来说很好用,返回文本标签的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"

相关问题