【问题标题】:Swift - How to remove a decimal from a float if the decimal is equal to 0?Swift - 如果小数等于 0,如何从浮点数中删除小数?
【发布时间】:2015-10-02 03:16:24
【问题描述】:

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

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

【问题讨论】:

标签: ios swift floating-point


【解决方案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)
    }
}

【讨论】:

  • 我在distanceFloat = floor(distanceFloat * 10) / 10 之前添加了这一行,然后它就完美运行了,谢谢:)
  • 对于 Double,扩展 Double { var clean: String { return self % 1 == 0 ? String(format: "%.0d", self) : String(self) } }
  • 如果浮点数类似于 3.01,这将不起作用。
  • 负数呢?
  • 对这个123456738.0号码不起作用,转换后的号码是123456736
【解决方案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

【讨论】:

  • 完美!这需要放在首位
  • 对于 Swift 3:let formatter = NumberFormatter() formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string(from: value as NSNumber) ?? "n/a"
  • 0.3000 怎么样,我试试这个得到 .3;我设置了它的样式formatter.numberStyle = .decimal
  • @stanliu 是正确的,如果你不添加.decimal numberStyle 低于 1 的数字将不显示零。例如:.5、.78 等...现在编辑答案。
  • 我相信这是苹果解决此类问题的意图。
【解决方案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 文件为 here

【讨论】:

  • 但是 3.230000 -> 3.230000... "-> 3.23" 怎么样?
  • @CHiP-love-NY,我没听懂你。
  • 我相信他认为您的扩展不会删除尾随零,但确实如此。字符串(3.230000)=“3.23”
【解决方案4】:

swift 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

【讨论】:

  • 放 ie 时不起作用。 14.000005,它转换为 14.0
  • @sc13 嗯,这很奇怪,如果你将它推出到 14.00000005 时,浮动本身会返回 14 而没有'cleanValue'。认为这与 swift 处理 Float 的方式有关。去看看我能不能修复那个错误。
  • 我得到了 14.000005 的正确输出,所以 @sc13 评论似乎过时或不正确。
【解决方案5】:

要将其格式化为字符串,请遵循此模式

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 会根据需要自动根据以下数字对最后一位数字进行四舍五入。

【讨论】:

    【解决方案6】:

    您可以使用前面提到的扩展程序,不过这个解决方案要短一些:

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

    示例用法:

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

    【讨论】:

    【解决方案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)
    

    【讨论】:

    • 不会从值1.1 中修剪零:输出将是"1.10"
    • @Cœur 它用于在点(。)之后显示两个值。如果您只想显示一个值,则使用“ return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.1f", self)/ / "
    • 我知道...我只是在描述您的代码与其他答案行为有何不同。
    【解决方案8】:

    斯威夫特 5 对于 Double,它与 @Frankie 对 float 的回答相同

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

    【讨论】:

      【解决方案9】:

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

      当需要自定义输出精度时,这种情况很好。 这个解决方案似乎与 NumberFormatter + NSNumber solution from 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”

      【讨论】:

        【解决方案10】:

        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"
        

        【讨论】:

          【解决方案11】:

          这是完整的代码。

          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 以使用 Float(Int(number)) 进行操作。
          3. 使用number - Float(Int(number)) 获取十进制数字值
          4. 使用if number - Float(Int(number)) == 0 检查十进制数字值是否为空

          if 和 else 语句中的内容无需解释。

          【讨论】:

          • 在你的情况下,你想让函数返回String 而不是println(result)return result。我希望这会有所帮助!
          【解决方案12】:

          简单:

          Int(floor(myFloatValue))
          

          【讨论】:

          • 这不是总是去掉小数点吗? OP 不希望这样。
          • 非常简单的答案。
          • 这将始终删除小数,不仅在 .0 时
          【解决方案13】:

          Swift 5.5 让它变得简单

          只需使用带有默认FloatingPointFormatStyle 的新formatted() api:

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

          【讨论】:

            【解决方案14】:

            这可能也有帮助。

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

            【讨论】:

              【解决方案15】:

              也许stringByReplacingOccurrencesOfString 可以帮助你:)

              let aFloat: Float = 1.000
              
              let aString: String = String(format: "%.1f", aFloat) // "1.0"
              
              let wantedString: String = aString.stringByReplacingOccurrencesOfString(".0", withString: "") // "1"
              

              【讨论】:

              • 这会破坏像 1.05 --> 15 这样的值
              • @Starceaker 不,1.05 执行String(format: "%.1f", aFloat) 首先将是1.0,有效。如果1.05 执行String(format: "%.2f", aFloat) 将是1.05,而不应该这样做stringByReplacingOccurrencesOfString(".00"...)
              • 正确,我专注于最后一行。我以为您提出了几种解决方案,但实际上您的线路已连接。我的错。
              • 没什么 :)
              猜你喜欢
              • 2023-03-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-15
              • 2019-01-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多