Swift - 如果小数等于0,如何从float中删除小数?

Kal*_*ney 67 floating-point ios swift

我显示一个十进制的距离,我想删除这个小数,如果它等于0(例如:1200.0Km),我怎么能在swift中做到这一点?我正在显示这样的数字:

let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"
Run Code Online (Sandbox Code Playgroud)

Fra*_*kie 97

迅捷3/4:

var distanceFloat1: Float = 5.0
var distanceFloat2: Float = 5.540
var distanceFloat3: Float = 5.03

extension Float {
    var clean: String {
       return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }
}

print("Value \(distanceFloat1.clean)") // 5
print("Value \(distanceFloat2.clean)") // 5.54
print("Value \(distanceFloat3.clean)") // 5.03
Run Code Online (Sandbox Code Playgroud)

Swift 2(原始答案)

let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: distanceFloat == floor(distanceFloat) ? “%.0f" : "%.1f", distanceFloat) + "Km"
Run Code Online (Sandbox Code Playgroud)

或作为扩展:

extension Float {
    var clean: String {
        return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果float类似于3.01,这将不起作用. (3认同)
  • 对于 Double,扩展 Double { var clean: String { return self % 1 == 0 ? 字符串(格式:“%.0d”,自我):字符串(自我)}} (2认同)

Mir*_*ekE 81

使用NSNumberFormatter:

let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2

// Avoid not getting a zero on numbers lower than 1
// Eg: .5, .67, etc...
formatter.numberStyle = .decimal

let nums = [3.0, 5.1, 7.21, 9.311, 600.0, 0.5677, 0.6988]

for num in nums {
    print(formatter.string(from: num as NSNumber) ?? "n/a")
}
Run Code Online (Sandbox Code Playgroud)

返回:

3

5.1

7.21

9.31

600

0.57

0.7

  • 对于Swift 3:```let formatter = NumberFormatter()formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string(from:value as NSNumber)?? "N/A"``` (5认同)
  • 完美!这需要在最顶层 (2认同)

Ash*_*hok 53

extension 这是有效的方法.

扩展:

Swift 2的代码(不是Swift 3或更新版本):

extension Float {
    var cleanValue: String {
        return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var sampleValue: Float = 3.234
print(sampleValue.cleanValue)
Run Code Online (Sandbox Code Playgroud)

3.234

sampleValue = 3.0
print(sampleValue.cleanValue)
Run Code Online (Sandbox Code Playgroud)

3

sampleValue = 3
print(sampleValue.cleanValue)
Run Code Online (Sandbox Code Playgroud)

3


示例Playground文件在这里.


Chr*_*sen 30

更新swift 3的已接受答案:

extension Float
{
    var cleanValue: String
    {
        return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法只是:

let someValue: Float = 3.0

print(someValue.cleanValue) //prints 3
Run Code Online (Sandbox Code Playgroud)

  • 我得到了 14.000005 的正确输出,所以 @sc13 评论似乎过时或不正确。 (2认同)

Tre*_*v14 16

Swift 5.5让一切变得简单

formatted()只需使用带有默认值的新api 即可FloatingPointFormatStyle

let values: [Double] = [1.0, 4.5, 100.0, 7]
for value in values {
    print(value.formatted(FloatingPointFormatStyle()))
}
// prints "1, 4.5, 100, 7"
Run Code Online (Sandbox Code Playgroud)


Nik*_*iko 7

您可以使用已经提到的扩展,但这个解决方案有点短:

extension Float {
    var shortValue: String {
        return String(format: "%g", self)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

var sample: Float = 3.234
print(sample.shortValue)
Run Code Online (Sandbox Code Playgroud)


Moh*_*ban 7

Swift 5 for Double 与@Frankie 对 float 的回答相同

var dec: Double = 1.0
dec.clean // 1
Run Code Online (Sandbox Code Playgroud)

对于扩展

extension Double {
    var clean: String {
       return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }

}
Run Code Online (Sandbox Code Playgroud)


Bai*_*aig 6

要将其格式化为String,请遵循此模式

let aFloat: Float = 1.123

let aString: String = String(format: "%.0f", aFloat) // "1"
let aString: String = String(format: "%.1f", aFloat) // "1.1"
let aString: String = String(format: "%.2f", aFloat) // "1.12"
let aString: String = String(format: "%.3f", aFloat) // "1.123"
Run Code Online (Sandbox Code Playgroud)

要将其格式化为Int,请遵循此模式

let aInt: Int = Int(aFloat) // "1"
Run Code Online (Sandbox Code Playgroud)


Jay*_*dip 6

Swift 4中尝试这个.

    extension CGFloat{
        var cleanValue: String{
            //return String(format: 1 == floor(self) ? "%.0f" : "%.2f", self)
            return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.2f", self)//
        }
    }
Run Code Online (Sandbox Code Playgroud)

//如何使用 - 如果在(.)点后输入多于两个字符,它会自动裁剪最后一个字符,并且只显示该点后的两个字符.

let strValue = "32.12"
print(\(CGFloat(strValue).cleanValue)
Run Code Online (Sandbox Code Playgroud)


Cœu*_*œur 5

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

\n

当需要自定义输出精度时,这种情况很好。\n此解决方案看起来与MirekE 的 NumberFormatter + NSNumber 解决方案大致一样快,但一个好处可能是我们在这里避免使用 NSObject。

\n
extension Double {\n    func string(maximumFractionDigits: Int = 2) -> String {\n        let s = String(format: "%.\\(maximumFractionDigits)f", self)\n        var offset = -maximumFractionDigits - 1\n        for i in stride(from: 0, to: -maximumFractionDigits, by: -1) {\n            if s[s.index(s.endIndex, offsetBy: i - 1)] != "0" {\n                offset = i\n                break\n            }\n        }\n        return String(s[..<s.index(s.endIndex, offsetBy: offset)])\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(也适用于extension Float,但不适用于仅限 macOS 的类型Float80

\n

用法:myNumericValue.string(maximumFractionDigits: 2)myNumericValue.string()

\n

输出maximumFractionDigits: 2

\n
\n

1.0 \xe2\x86\x92 "1"
\n0.12 \xe2\x86\x92 "0.12"
\n0.012 \xe2\x86\x92 "0.01"
\n0.0012 \xe2\x86\x92 "0"
\ n0.00012\xe2\x86\x92“0”

\n
\n