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