我有一个用例,其中我想确定swift中的NSDecimalNumber是否具有小数部分(非0)。我可以截断小数部分,但是这涉及到创建一个新的NSDecimalNumber,如果可能的话,我想避免这种情况。
我正在计算属性中执行此操作,因此我希望它尽可能高效。目前,这是我的扩展程序在操场上的样子:
extension NSDecimalNumber {
func decimalNumberRoundedToDigits(withDecimals: UInt8, roundingMode: NSRoundingMode = NSRoundingMode.RoundPlain) -> NSDecimalNumber
{
// round to required decimals
let disp = decimalNumberByRoundingAccordingToBehavior(NSDecimalNumberHandler(roundingMode: roundingMode, scale: Int16(withDecimals), raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false));
return disp;
}
// Convert the least significant byte into a signed 8-bit integer
// Currently just truncates the fractional portion - I would like
// to test it instead and only round if there are decimals.
var safeByteValue: Int8 {
get {
let bits = UInt8(decimalNumberRoundedToDigits(0).longLongValue & 0xFF);
return Int8(bitPattern: bits);
}
};
}
// just a test loop for demonstration
for i in 0...256
{
print(NSDecimalNumber(unsignedInt: UInt32(bitPattern: Int32(i))).safeByteValue);
}
最佳答案
我不知道这样做的效率如何,但确实可以为您提供答案:
extension NSDecimalNumber {
var hasFractionalComponent: Bool {
return ("\(num)").unicodeScalars.contains(UnicodeScalar("."))
}
}