00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _decimal_h
00018 #define _decimal_h
00019
00020 #include <spl/types.h>
00021 #include <spl/Numeric.h>
00022 #include <spl/String.h>
00023
00030 #define DECIMAL_MAJIC 0x1234 //< Majic number for ASSERT's in Compare and Convert
00031
00035 class Decimal : public Numeric
00036 {
00037 protected:
00038 int64 n;
00039
00040 static const int precision;
00041 static const int64 q;
00042
00043 inline static Decimal Intern(int64 n) { Decimal dec(0); dec.n = n; return dec; }
00044
00045 Decimal(int64 intPart, int64 fractPart);
00046
00047 inline void Init(int64 intPart, int64 fractPart)
00048 {
00049 n=intPart;
00050 n*=q;
00051 n+=fractPart;
00052 }
00053
00054 public:
00055 static void Initialize();
00056
00057 Decimal(const int64 i);
00058 Decimal(const int32 i);
00059 Decimal(const int16 i);
00060 Decimal(void);
00061 Decimal(const Decimal& d);
00062 Decimal(const double d);
00063 Decimal(const float d);
00064
00065 virtual ~Decimal(void);
00066
00067 Decimal Round();
00068
00069 Decimal& operator =(const Decimal& d);
00070 Decimal& operator =(const int32 d);
00071 Decimal& operator =(const int64 d);
00072 Decimal& operator =(const float d);
00073 Decimal& operator =(const double d);
00074 Decimal operator +(const Decimal& d) const;
00075 Decimal operator -(const Decimal& d) const;
00076 Decimal operator *(const Decimal& d) const;
00077 Decimal operator /(const Decimal& d) const;
00078
00079 Decimal operator +=(const Decimal& d);
00080 Decimal operator -=(const Decimal& d);
00081 Decimal operator *=(const Decimal& d);
00082 Decimal operator /=(const Decimal& d);
00083
00084 bool operator ==(const Decimal&) const;
00085 bool operator !=(const Decimal&) const;
00086 bool operator <(const Decimal&) const;
00087 bool operator <=(const Decimal&) const;
00088 bool operator >(const Decimal&) const;
00089 bool operator >=(const Decimal&) const;
00090
00091 virtual int ToInt() const;
00092 virtual double ToDouble() const;
00093 virtual StringPtr ToString() const;
00094 inline int64 ToLongInt(void) const { return (int64)(n/q); }
00095
00096 virtual int32 HashCode() const;
00097
00098 inline Decimal Abs() { if ( n < 0 ) return Decimal(n * -1); return Decimal(n); }
00099
00100 inline int64 RawData() const { return n; }
00101 inline static Decimal Parse( const String *str ) { return Parse(*str); }
00102 static Decimal Parse( const String& str );
00103
00104 bool Equals(Decimal *d) const;
00105 virtual bool Equals(const IComparable *a) const;
00106 virtual int Compare(const IComparable *a) const;
00107 virtual bool Equals( const IComparable& a ) const;
00108 virtual int Compare( const IComparable& a ) const;
00109 virtual int32 MajicNumber() const;
00110
00111 #ifdef DEBUG
00112 virtual void ValidateMem() const;
00113 virtual void CheckMem() const;
00114 #endif
00115 };
00116
00117 inline void ValidateType(Decimal& dec)
00118 {
00119 }
00120
00121 inline void ValidateType(Decimal *dec)
00122 {
00123 ASSERT_PTR(dec);
00124 DEBUG_NOTE_MEM(dec);
00125 }
00126
00127 REGISTER_TYPEOF( 560, Decimal );
00128
00131 #endif
00132