Подтвердить что ты не робот

Swift - Как удалить десятичное число из float, если десятичное число равно 0?

Я показываю расстояние с одним десятичным знаком, и я хотел бы удалить это десятичное число, если оно равно 0 (например: 1200.0Km), как я могу сделать это в swift? Я показываю этот номер следующим образом:

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

Ответ 1

Свифт 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)
    }
}

Ответ 2

Используйте 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

600

0,57

0.7

Ответ 3

extension является мощным способом сделать это.

Расширение:

Код для Swift 2 (не Swift 3 или новее):

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 находится здесь.

Ответ 4

Обновление принятого ответа для быстрого 3:

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

будет просто:

let someValue: Float = 3.0

print(someValue.cleanValue) //prints 3

Ответ 5

Вы можете использовать расширение, как уже упоминалось, хотя это решение немного короче:

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

Пример использования:

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

Ответ 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"

Чтобы отформатировать его в Int, следуйте этому шаблону

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

Ответ 7

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

Ответ 8

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"

Ответ 9

Здесь полный код.

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) {
  • Сбрасывает десятичные числа с плавающей запятой Int(number).
  • Возвращает оставшееся число обратно к float для выполнения операции с Float(Int(number)).
  • Возвращает десятичное число с number - Float(Int(number))
  • Проверяет, что значение десятичной цифры пустое с помощью if number - Float(Int(number)) == 0

Содержимое внутри операторов if и else не нуждается в пояснении.

Ответ 10

Форматирование с максимальными дробными цифрами, без конечных нулей

Этот сценарий хорош, когда желательна настраиваемая точность вывода. Это решение кажется примерно таким же быстрым, как решение 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, но не с типом Float80 только для 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"

Ответ 11

Это также может быть полезно.

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

Ответ 12

Здесь расширение, которое должно выполнить трюк:

extension String {
var clean: String
{
        var stringCharacters = Array(self.characters)
        var isDoubleDot = false
        for character in stringCharacters {
            if character == "." {
               isDoubleDot = true
                break
            } else {
            isDoubleDot = false
            }
        }
        if isDoubleDot == true {
            while 1 == 1 {
                if  stringCharacters[stringCharacters.count-1] == "0" || stringCharacters[stringCharacters.count-1] == "."  {
            stringCharacters.remove(at: stringCharacters.count-1)
            } else {
                break
                }
            }
           return String(stringCharacters)
        } else {
    return self
    }
}
}

Использование:

let number1 = "54.530000"
let number2 = "65.0"
let number3 = "21.243"

print(number1.clean) //54.53
print(number2.clean) //65
print(number3.clean) //21.243

Ответ 13

Просто:

Int(floor(myFloatValue))

Ответ 14

Может быть, stringByReplacingOccurrencesOfString может вам помочь:)

let aFloat: Float = 1.000

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

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