如何从浮点数中移除一个小数,如果小数等于0?

我正在显示一个距离与一个小数点,我想删除这个小数点,以防它是等于0(例如: 1200.0公里) ,我怎样才能做到这一点迅速? 我这样显示这个数字:

let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"
115891 次浏览

Swift 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

Swift 2(原答案)

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

或者作为一种延伸:

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

NSNumberFormatter 是你的朋友

let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
let numberFormatter = NSNumberFormatter()
numberFormatter.positiveFormat = "###0.##"
let distance = numberFormatter.stringFromNumber(NSNumber(float: distanceFloat))!
distanceLabel.text = distance + " Km"

使用 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")
}

返回:

3

5.1

7.21

9.31

六百

0.57

0.7

这是全部密码。

let numberA: Float = 123.456
let numberB: Float = 789.000


func displayNumber(number: Float) {
if number - Float(Int(number)) == 0 {
println("\(Int(number))")
} else {
println("\(number)")
}
}


displayNumber(numberA) // console output: 123.456
displayNumber(numberB) // console output: 789

这是最重要的一条线。

func displayNumber(number: Float) {
  1. Int(number)去掉浮点数的小数位。
  2. 返回浮点数以执行对 Float(Int(number))的操作。
  3. 使用 number - Float(Int(number))获取十进制数字值
  4. if number - Float(Int(number)) == 0检查十进制数字值是否为空

If 和 else 语句中的内容不需要解释。

extension是强有力的方法。

延伸部分 :

Code for Swift 2 (not Swift 3 or newer):

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

用法 :

var sampleValue: Float = 3.234
print(sampleValue.cleanValue)

3.234

sampleValue = 3.0
print(sampleValue.cleanValue)

3

sampleValue = 3
print(sampleValue.cleanValue)

3


样本 Playground 文件是 给你

也许 stringByReplacingOccurrencesOfString可以帮助你:)

let aFloat: Float = 1.000


let aString: String = String(format: "%.1f", aFloat) // "1.0"


let wantedString: String = aString.stringByReplacingOccurrencesOfString(".0", withString: "") // "1"

你可以像前面提到的那样使用扩展,不过这个解决方案要短一些:

extension Float {
var shortValue: String {
return String(format: "%g", self)
}
}

示例用法:

var sample: Float = 3.234
print(sample.shortValue)

更新“迅捷3”的接受答案 :

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

usage would just be:

let someValue: Float = 3.0


print(someValue.cleanValue) //prints 3

这可能也有帮助。

extension Float {
func cleanValue() -> String {
let intValue = Int(self)
if self == 0 {return "0"}
if self / Float (intValue) == 1 { return "\(intValue)" }
return "\(self)"
}
}

用法:

let number:Float = 45.23230000
number.cleanValue()

要将其格式化为 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"

要将其转换为 Int,请遵循以下模式

let aInt: Int = Int(aFloat) // "1"

当您使用 String(format:初始值设定项时,Swift 会根据以下数字自动四舍五入最后的数字。

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)//
}
}

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

let strValue = "32.12"
print(\(CGFloat(strValue).cleanValue)

格式设置为最大分数位,不带尾随零

当需要自定义输出精度时,这种场景非常好。 这个解决方案看起来大致和 NumberFormatter + NSNumber 来自 MirekE 的解决方案一样快,但是一个好处可能是我们在这里避免了 NSObject。

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

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

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

maximumFractionDigits: 2的输出:

1.0→“1”
0.12→“0.12”
0.012→“0.01”
0.0012→“0”
0.00012→“0”

简单:

Int(floor(myFloatValue))

Swift 5 “双倍”和“弗兰基的浮动”是一样的

var dec: Double = 1.0
dec.clean // 1

为了延期

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


}

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"