2015-07-13 2 views
28

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

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

ответ

30

Как насчет этого?

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

Я добавил эту строку перед 'distanceFloat = пол (distanceFloat * 10)/10', а затем она работала отлично, спасибо :) –

+0

Хорошо рад, что ты получил это работает! – Frankie

+0

Для Double, extension Double { var clean: String { return self% 1 == 0? Строка (формат: "%.0d», самость): String (само) } } – Abo3atef

4

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" 
30

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

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

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

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

возвратов:

5,1

7,2

9,3

+1

идеально Это должно быть на вершине – GoodSp33d

+3

для Swift 3:.! ' '' пусть форматировщик = NumberFormatter () formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string (from: значение как NSNumber)? "N/a" '' ' – alexxjk

3

Вот полный код.

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

содержимого внутри, если это и другого заявления не нуждается в объяснении.

+0

В вашем случае вы хотите сделать функция возвращает 'String' и вместо' println (result) 'do' return result'. Надеюсь, это поможет! –

44

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

Расширение:

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) 
sampleValue = 3 
print(sampleValue.cleanValue) 


Sample площадка файл here.

+1

Но 3.230000 -> 3.230000 ... как насчет "-> 3.23"? –

+1

@ CHiP-love-NY , Я не получил вас. –

+1

Я считаю, он думает, что ваше расширение не удаляет конечные нули, но я т. String (3.230000) = "3.23" – jeffjv

0

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

let aFloat: Float = 1.000 

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

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

Это сломает значение, подобное 1.05 -> 15 – Starceaker

+0

@Starceaker Нет, '1.05' execute' String (формат: «% .1f», aFloat) 'first будет' 1.0', работает. if '1.05' execute' String (format: "% .2f", aFloat) 'будет' 1.05', а должен сделать это 'stringByReplacingOccurrencesOfString (". 00 "...)' – Leo

+0

Правильно, я сосредоточился на последнем линия. Я думал, вы предложили несколько решений, но на самом деле ваши линии связаны. Виноват. – Starceaker

3

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

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

Пример:

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

короткое и к тому же спасибо большое – MikeG

0

Вот расширение, которое должно сделать трюк:

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 
19

Обновление принятого ответа для быстрой 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 
+0

Не работает, когда вы кладете то есть. 14.000005, он преобразуется в 14.0 – sc13

+0

@ sc13 Да, это странно, если вы выталкиваете его до 14.00000005, в этот момент сам поплавок возвращается без «cleanValue». Подумайте, что это связано с тем, как быстро обрабатывает Float. Пойдем посмотреть, смогу ли я исправить эту ошибку. –

0

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

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

Чтобы отформатировать его в строку, следовать этому образцу

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" 
0

В 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) 
Смежные вопросы