/* NSDecimalNumber.h Copyright (c) 1995-2012, Apple Inc. All rights reserved. */ #import #import #import #import /*************** Exceptions ***********/ FOUNDATION_EXPORT NSString * const NSDecimalNumberExactnessException; FOUNDATION_EXPORT NSString * const NSDecimalNumberOverflowException; FOUNDATION_EXPORT NSString * const NSDecimalNumberUnderflowException; FOUNDATION_EXPORT NSString * const NSDecimalNumberDivideByZeroException; /*************** Rounding and Exception behavior ***********/ @class NSDecimalNumber; @protocol NSDecimalNumberBehaviors - (NSRoundingMode)roundingMode; - (short)scale; // The scale could return NO_SCALE for no defined scale. - (NSDecimalNumber *)exceptionDuringOperation:(SEL)operation error:(NSCalculationError)error leftOperand:(NSDecimalNumber *)leftOperand rightOperand:(NSDecimalNumber *)rightOperand; // Receiver can raise, return a new value, or return nil to ignore the exception. @end /*************** NSDecimalNumber: the class ***********/ @interface NSDecimalNumber : NSNumber { @private signed int _exponent:8; unsigned int _length:4; unsigned int _isNegative:1; unsigned int _isCompact:1; unsigned int _reserved:1; unsigned int _hasExternalRefCount:1; unsigned int _refs:16; unsigned short _mantissa[0]; /* GCC */ } - (id)initWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag; - (id)initWithDecimal:(NSDecimal)dcm; - (id)initWithString:(NSString *)numberValue; - (id)initWithString:(NSString *)numberValue locale:(id)locale; - (NSString *)descriptionWithLocale:(id)locale; - (NSDecimal)decimalValue; + (NSDecimalNumber *)decimalNumberWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag; + (NSDecimalNumber *)decimalNumberWithDecimal:(NSDecimal)dcm; + (NSDecimalNumber *)decimalNumberWithString:(NSString *)numberValue; + (NSDecimalNumber *)decimalNumberWithString:(NSString *)numberValue locale:(id)locale; + (NSDecimalNumber *)zero; + (NSDecimalNumber *)one; + (NSDecimalNumber *)minimumDecimalNumber; + (NSDecimalNumber *)maximumDecimalNumber; + (NSDecimalNumber *)notANumber; - (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber; - (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(id )behavior; - (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber; - (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(id )behavior; - (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber; - (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(id )behavior; - (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber; - (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(id )behavior; - (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power; - (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power withBehavior:(id )behavior; - (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power; - (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(id )behavior; - (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(id )behavior; // Round to the scale of the behavior. - (NSComparisonResult)compare:(NSNumber *)decimalNumber; // compare two NSDecimalNumbers + (void)setDefaultBehavior:(id )behavior; + (id )defaultBehavior; // One behavior per thread - The default behavior is // rounding mode: NSRoundPlain // scale: No defined scale (full precision) // ignore exactnessException // raise on overflow, underflow and divide by zero. - (const char *)objCType NS_RETURNS_INNER_POINTER; // return 'd' for double - (double)doubleValue; // return an approximate double value @end /*********** A class for defining common behaviors *******/ @interface NSDecimalNumberHandler : NSObject { @private signed int _scale:16; unsigned _roundingMode:3; unsigned _raiseOnExactness:1; unsigned _raiseOnOverflow:1; unsigned _raiseOnUnderflow:1; unsigned _raiseOnDivideByZero:1; unsigned _unused:9; void *_reserved2; void *_reserved; } + (id)defaultDecimalNumberHandler; // rounding mode: NSRoundPlain // scale: No defined scale (full precision) // ignore exactnessException (return nil) // raise on overflow, underflow and divide by zero. - (id)initWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero; + (id)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero; @end /*********** Extensions to other classes *******/ @interface NSNumber (NSDecimalNumberExtensions) - (NSDecimal)decimalValue; // Could be silently inexact for float and double. @end @interface NSScanner (NSDecimalNumberScanning) - (BOOL)scanDecimal:(NSDecimal *)dcm; @end