Ios Swift-从双精度中删除尾随零

Ios Swift-从双精度中删除尾随零,ios,swift,double,trailing,Ios,Swift,Double,Trailing,从double中删除尾随零的函数是什么 var double = 3.0 var double2 = 3.10 println(func(double)) // 3 println(func(double2)) // 3.1 您可以这样做,但它将返回一个字符串: var double = 3.0 var double2 = 3.10 func forTrailingZero(temp: Double) -> String { var tempVar = String(form

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

var double = 3.0
var double2 = 3.10

println(func(double)) // 3
println(func(double2)) // 3.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

在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) ?? "")
    }
}
使用示例:
打印(双精度(“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) ?? "")
    }
}
删除输出中的尾随零 当需要默认的输出精度时,这种情况很好。我们测试潜在尾随零的值,并根据它使用不同的输出格式

extension Double {
    var stringWithoutZeroFraction: String {
        return truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }
}
(也适用于
扩展浮点
,但不适用于
Float80

输出:

1.0→ “1”
0.1→ “0.1”
0.01→ “0.01”
0.001→ “0.001”
0.0001→ “0.0001”

使用最大分数位数格式化,不带尾随零 当需要自定义输出精度时,这种情况很好。 此解决方案的速度大致与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)])
    }
}
双分机{
func字符串(最大分数位数:Int=2)->字符串{
设s=字符串(格式:“%.\(最大分数位数)f”,self)
对于步幅中的i(从:0到:-maximumFractionDigits,由:-1){
如果s[s.index(s.endIndex,offsetBy:i-1)]!=“0”{

返回字符串[…,以防您正在查看如何从字符串中删除尾随零:

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

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

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

双精度浮点没有尾随零,只有字符串表示形式。请查看
NSNumberFormatter
字符串(格式:…)
。在这里应该已经有了这两种格式的一些示例。您也可以使用numberFormatter,如本示例中所示:注意,如果数字太大,“%g”格式将切换为科学记数法:
forTailingZero(123456789)==1.23457e+08
:)我认为在这个答案中描述了更为优化的解决方案:它将“0.517”转换为“.517”。这不是少数人的要求。我认为在这种情况下,您可以使用“formatter.MinimumIntegraterDigits=1”。当
maximumFractionDigits
=0,254.9998480081558=>“25”时,最简单的方法通常是最简单的。