Swift - How to remove a decimal from a float if the decimal is equal to 0?

IosSwiftFloating Point

Ios Problem Overview


I'm displaying a distance with one decimal, and I would like to remove this decimal in case it is equal to 0 (ex: 1200.0Km), how could I do that in swift? I'm displaying this number like this:

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

Ios Solutions


Solution 1 - Ios

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 (Original answer)

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

Or as an extension:

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

Solution 2 - Ios

Use 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")
}

Returns:

3

5.1

7.21

9.31

600

0.57

0.7

Solution 3 - Ios

extension is the powerful way to do it.

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

Usage:

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

> 3.234

sampleValue = 3.0
print(sampleValue.cleanValue)

> 3

sampleValue = 3
print(sampleValue.cleanValue)

> 3


Sample Playground file is here.

Solution 4 - Ios

Update of accepted answer for swift 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

Solution 5 - Ios

To format it to String, follow this pattern

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"

To cast it to Int, follow this pattern

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

When you use String(format: initializer, Swift will automatically round the final digit as needed based on the following number.

Solution 6 - Ios

You can use an extension as already mentioned, this solution is a little shorter though:

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

Example usage:

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

Solution 7 - Ios

Swift 5 for Double it's same as @Frankie's answer for float

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

for the extension

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

}

Solution 8 - Ios

In Swift 4 try this.

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

//How to use - if you enter more then two-character after (.)point, it's automatically cropping the last character and only display two characters after the point.

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

Solution 9 - Ios

Formatting with maximum fraction digits, without trailing zeros

This scenario is good when a custom output precision is desired. This solution seems roughly as fast as NumberFormatter + NSNumber solution from MirekE, but one benefit could be that we're avoiding NSObject here.

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

(works also with extension Float, but not the macOS-only type Float80)

Usage: myNumericValue.string(maximumFractionDigits: 2) or myNumericValue.string()

Output for maximumFractionDigits: 2:

>1.0 → "1"
>0.12 → "0.12"
>0.012 → "0.01"
>0.0012 → "0"
>0.00012 → "0"

Solution 10 - Ios

NSNumberFormatter is your friend

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"

Solution 11 - Ios

Simple :

Int(floor(myFloatValue))

Solution 12 - Ios

Swift 5.5 makes it easy

Just use the new formatted() api with a default 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"

Solution 13 - Ios

Here's the full code.

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

Here's the most important line in-depth.

func displayNumber(number: Float) {
  1. Strips the float's decimal digits with Int(number).
  2. Returns the stripped number back to float to do an operation with Float(Int(number)).
  3. Gets the decimal-digit value with number - Float(Int(number))
  4. Checks the decimal-digit value is empty with if number - Float(Int(number)) == 0

The contents within the if and else statements doesn't need explaining.

Solution 14 - Ios

This might be helpful too.

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

Usage:

let number:Float = 45.23230000
number.cleanValue()

Solution 15 - Ios

Maybe stringByReplacingOccurrencesOfString could help you :)

let aFloat: Float = 1.000

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKali AneyView Question on Stackoverflow
Solution 1 - IosFrankieView Answer on Stackoverflow
Solution 2 - IosMirekEView Answer on Stackoverflow
Solution 3 - IosAshokView Answer on Stackoverflow
Solution 4 - IosChristopher LarsenView Answer on Stackoverflow
Solution 5 - IosBaigView Answer on Stackoverflow
Solution 6 - IosLinusView Answer on Stackoverflow
Solution 7 - IosMohamed ShabanView Answer on Stackoverflow
Solution 8 - IosJaydipView Answer on Stackoverflow
Solution 9 - IosCœurView Answer on Stackoverflow
Solution 10 - IosvadianView Answer on Stackoverflow
Solution 11 - IosergunkocakView Answer on Stackoverflow
Solution 12 - IosTrev14View Answer on Stackoverflow
Solution 13 - IosFine ManView Answer on Stackoverflow
Solution 14 - IosSantoshView Answer on Stackoverflow
Solution 15 - IosLeoView Answer on Stackoverflow