用未知数字格式化小数位

Formatting decimal places with unknown number

我正在打印一个我不知道其值的数字。在大多数情况下,数字是整数或尾随 .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

}

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

但听起来您不想要尾随零,因此您可能希望 trim 将其关闭。 (有没有办法用 format 来做到这一点?编辑:是的,g 正如@simons 指出的那样)

最后,这真的不应该是一个 class 函数,因为它是在基本类型上运行的。最好让它成为一个自由函数,或者扩展 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

您可以使用 %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"

A 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

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

舍入浮点数并将尾随零去除为所需的 minimum/maximum 小数位数。

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