使用Swift 3。
我在网上找到了很多奇怪的解决方案,用于检查一个 Decimal
对象是否为整数。所有东西都感觉比必要的复杂得多。
这是我的解决方案:
extension Decimal {
var isWholeNumber: Bool {
return self.exponent == 1
}
}
在我的测试中,这个是有效的。我的问题是,我是否漏掉了一些显而易见的东西?
谢谢评论!这是我现在正在使用的。
extension Decimal {
var isWholeNumber: Bool {
return self.isZero || (self.isNormal && self.exponent >= 0)
}
}
Decimal
提供一个错误的负数。 - AlexanderDecimal(1.00000000000000009).isWholeNumber
返回 true
,对于17位数字而言,这里的关键是不要从double转换为Decimal。 - William Hu以下是将Objective-C解决方案翻译成Swift的结果:(参考链接)
extension Decimal {
var isWholeNumber: Bool {
if isZero { return true }
if !isNormal { return false }
var myself = self
var rounded = Decimal()
NSDecimalRound(&rounded, &myself, 0, .plain)
return self == rounded
}
}
print(Decimal(string: "1234.0")!.isWholeNumber) // true
print(Decimal(string: "1234.5")!.isWholeNumber) // false
即使尾数不是最小值(或指数不是最大值),例如100 * 10-1,此方法仍然有效。示例:
let z = Decimal(_exponent: -1, _length: 1, _isNegative: 0, _isCompact: 1, _reserved: 0,
_mantissa: (100, 0, 0, 0, 0, 0, 0, 0))
print(z) // 10.0
print(z.exponent) // -1
print(z.isWholeNumber) // true
guard !isZero
, guard isNormal
。 - Alexanderguard !isZero else { return true }
中使用“双重否定”并不更自然。零必须被单独处理,但它并不是一个“异常情况”。 - Martin Rguard
被引入是为了解决“if let金字塔问题”,但可以与任何布尔表达式一起使用。也许我表达不好,我只是反对在每种“提前返回”情况下都使用guard
。在这种情况下,“如果是零,则返回真”比“否则,返回真”更容易理解,在我看来。 - Martin R我对Swift还很新,但我正在将输入与四舍五入后的输入进行比较:
let input = 2.9
round(input) == input
3 2.9
我不确定它在所有情况下都能工作,但这可能是一个更简洁的选项
extension Decimal {
static var decimalSeparator: String { return NumberFormatter().decimalSeparator }
var isFraction: Bool {
return self.description.contains(Decimal.decimalSeparator)
}
var isWhole: Bool {
return !isFraction
}
}
self.exponent >= 0
,但除此之外,我想不到为什么它不能工作。 - John Montgomeryreturn self.isZero || (self.isNormal && self.exponent >= 0)
。 - mgChristopherget
关键字及其括号。例如:var isWholeNumber: Bool { return isZero || (isNormal && exponent >= 0) }
- Leo Dabus