' com/decimal.ab #require #require Class Decimal Public Sub Decimal(ByRef d As Decimal) dec = d End Sub Const Function Operator +() As Decimal Return New Decimal(dec) End Function Const Function Operator -() As Decimal Dim ret = New Decimal VarDecNeg(This.dec, ret.dec) Return ret End Function Const Function Operator *(y As Decimal) As Decimal Dim ret = New Decimal VarDecMul(This.dec, y.dec, ret.dec) Return ret End Function Const Function Operator *(y As Long) As Decimal Dim ret = New Decimal VarDecMulI4(This.dec, y, ret.dec) Return ret End Function Const Function Operator *(y As Int64) As Decimal Dim ret = New Decimal VarDecMulI8(This.dec, y, ret.dec) Return ret End Function Const Function Operator /(y As Decimal) As Decimal Dim ret = New Decimal VarDecDiv(This.dec, y.dec, ret.dec) Return ret End Function Const Function Operator +(y As Decimal) As Decimal Dim ret = New Decimal VarDecAdd(This.dec, y.dec, ret.dec) Return ret End Function Const Function Operator -(y As Decimal) As Decimal Dim ret = New Decimal VarDecSub(This.dec, y.dec, ret.dec) Return ret End Function Static Function Compare(x As Decimal, y As Decimal) As HRESULT Return VarDecCmp(x, y) End Function Static Function Compare(x As Decimal, y As Double) As HRESULT Return VarDecCmpR8(x, y) End Function Static Function Compare(x As Double, y As Decimal) As HRESULT Dim ret = VarDecCmpR8(y, x) Select Case ret Case VARCMP_LT Return VARCMP_GT Case VARCMP_GT Return VARCMP_LT Case Else Return ret End Select End Function Const Function Operator ==(y As Decimal) As Boolean Dim c = Compare(This, y) Return c = VARCMP_EQ End Function Const Function Operator ==(y As Double) As Boolean Dim c = Compare(This, y) Return c = VARCMP_EQ End Function Const Function Operator <>(y As Decimal) As Boolean Dim c = Compare(This, y) Return c <> VARCMP_EQ End Function Const Function Operator <>(y As Double) As Boolean Dim c = Compare(This, y) Return c <> VARCMP_EQ End Function Const Function Operator <(y As Decimal) As Boolean Dim c = Compare(This, y) Return c = VARCMP_LT End Function Const Function Operator <(y As Double) As Boolean Dim c = Compare(This, y) Return c = VARCMP_LT End Function /* Const Function Operator >(y As Decimal) As Boolean Dim c = Compare(This, y) Return c = VARCMP_GT End Function Const Function Operator >(y As Double) As Boolean Dim c = Compare(This, y) Return c = VARCMP_GT End Function */ Const Function Operator <=(y As Decimal) As Boolean Dim c = Compare(This, y) Return result = VARCMP_LT Or result = VARCMP_EQ End Function Const Function Operator <=(y As Double) As Boolean Dim c = Compare(This, y) Return result = VARCMP_LT Or result = VARCMP_EQ End Function Const Function Operator >=(y As Decimal) As Boolean Dim c = Compare(This, y) Return result = VARCMP_GT Or result = VARCMP_EQ End Function Const Function Operator >=(y As Double) As Boolean Dim c = Compare(This, y) Return result = VARCMP_GT Or result = VARCMP_EQ End Function Const Function Abs() As Decimal Abs = New Decimal VarDecAbs(This.dec, Abs.dec) End Function Const Function Fix() As Decimal Fix = New Decimal VarDecFix(This.dec, Fix.dec) End Function Const Function Int() As Decimal Int = New Decimal VarDecInt(This.dec, Int.dec) End Function Const Function Round(c = 0 As Long) As Decimal Round = New Decimal VarDecRound(This.dec, c, Round.dec) End Function Const Function Dec() As DECIMAL Return dec End Function Sub Dec(ByRef d As DECIMAL) dec = d End Sub Const Function ToVariant() As Variant Return New Variant(dec) End Function Override Function ToString() As String Dim bs As BSTR VarBstrFromDec(dec, LOCALE_USER_DEFAULT, LOCALE_USE_NLS, bs) ToString = New String(bs As PCWSTR, SysStringLen(bs) As Long) SysFreeString(bs) End Function Override Function GetHashCode() As Long Dim p = VarPtr(dec) As *DWord Return (p[0] Xor p[1] Xor p[2] Xor p[3]) As Long End Function Function Equals(y As Decimal) As Boolean Dim c = Compare(This, y) Return c = VARCMP_EQ End Function Private dec As DECIMAL End Class