格式化未知数字的小数位数

时间:2015-06-03 13:20:16

标签: swift logic

我打印出一个我不知道的价值的数字。在大多数情况下,数字是完整的或具有尾随.5。在某些情况下,数字以.25或.75结尾,很少这个数字到千分之一的地方。我如何具体检测最后一个案例?现在我的代码检测到整数(0位小数),正好是.5(1位小数),然后在所有其他方案中恢复为2个小数点,但是当它需要时我需要转到3。

class func getFormattedNumber(number: Float) -> NSString {

    var formattedNumber = NSString()

    // Use the absolute value so it works even if number is negative
    if (abs(number % 2) == 0) || (abs(number % 2) == 1) {  // Whole number, even or odd
        formattedNumber = NSString(format: "%.0f", number)
    }

    else if (abs(number % 2) == 0.5) || (abs(number % 2) == 1.5) {
        formattedNumber = NSString(format: "%.1f", number)
    }

    else {
        formattedNumber = NSString(format: "%.2f", number)
    }

    return formattedNumber

}

4 个答案:

答案 0 :(得分:12)

Float使用二进制(IEEE 754)表示,无法表示 精确的所有小数部分。例如,

let x : Float = 123.456

x存储字节42f6e979,大约是。{ 123.45600128173828。那么x有3个或14个小数位吗?

如果指定最大数量,则可以使用NSNumberFormatter 应该出现的十进制数字:

let fmt = NSNumberFormatter()
fmt.locale = NSLocale(localeIdentifier: "en_US_POSIX")
fmt.maximumFractionDigits = 3
fmt.minimumFractionDigits = 0

println(fmt.stringFromNumber(123)!)      // 123
println(fmt.stringFromNumber(123.4)!)    // 123.4
println(fmt.stringFromNumber(123.45)!)   // 123.45
println(fmt.stringFromNumber(123.456)!)  // 123.456
println(fmt.stringFromNumber(123.4567)!) // 123.457

Swift 3/4更新:

let fmt = NumberFormatter()
fmt.locale = Locale(identifier: "en_US_POSIX")
fmt.maximumFractionDigits = 3
fmt.minimumFractionDigits = 0

print(fmt.string(for: 123.456)!) // 123.456

答案 1 :(得分:3)

您可以使用%g来抑制尾随零。然后我认为你不需要经历确定地点数量的业务。例如 -

var num1:Double = 5.5
var x = String(format: "%g", num1) // "5.5"

var num2:Double = 5.75
var x = String(format: "%g", num2) // "5.75"

或指定场所数量的变化。例如 -

var num3:Double = 5.123456789
var x = String(format: "%.5g", num3) // "5.1235"

答案 2 :(得分:2)

我的2美分;)Swift 3准备好了

将浮动数字舍入,并将尾随零点删除到所需的最小/最大小数位数。

extension Double {
    func toString(minimumFractionDigits: Int = 0, maximumFractionDigits: Int = 2) -> String {
        let formatter = NumberFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.minimumFractionDigits = minimumFractionDigits
        formatter.maximumFractionDigits = maximumFractionDigits

        return formatter.string(from: self as NSNumber)!
    }
}

用法:

Double(394.239).toString() // Output: 394.24
Double(394.239).toString(maximumFractionDigits: 1) // Output: 394.2

答案 3 :(得分:0)

如果要将浮点数打印到3位小数,可以使用String(format: "%.3f")。这将是圆的,因此0.10000001变为0.1000.1009变为0.101等。

但听起来你不想要尾随的零,所以你可能想要修剪掉它们。 (有没有办法用format执行此操作?编辑:是,g正如@simons指出的那样)

最后,这实际上不应该是类函数,因为它在原始类型上运行。最好是使其成为自由函数,或者扩展Double / Float

extension Double {
    func toString(#decimalPlaces: Int)->String {
        return String(format: "%.\(decimalPlaces)g", self)
    }
}

let number = -0.3009
number.toString(decimalPlaces: 3)  // -0.301