23#include <systools/win32/oleauto.hxx>
29#include <com/sun/star/bridge/oleautomation/Decimal.hpp>
49 (
const css::bridge::oleautomation::Decimal& rAutomationDec )
53 maDec.scale = rAutomationDec.Scale;
54 maDec.sign = rAutomationDec.Sign;
55 maDec.Lo32 = rAutomationDec.LowValue;
56 maDec.Mid32 = rAutomationDec.MiddleValue;
57 maDec.Hi32 = rAutomationDec.HighValue;
64 ( css::bridge::oleautomation::Decimal& rAutomationDec )
67 rAutomationDec.Scale = maDec.scale;
68 rAutomationDec.Sign = maDec.sign;
69 rAutomationDec.LowValue = maDec.Lo32;
70 rAutomationDec.MiddleValue = maDec.Mid32;
71 rAutomationDec.HighValue = maDec.Hi32;
92 HRESULT hResult = VarDecSub( &maDec,
const_cast<LPDECIMAL
>(&r.maDec), &maDec );
93 bool bRet = ( hResult == S_OK );
99 HRESULT hResult = VarDecAdd( &maDec,
const_cast<LPDECIMAL
>(&r.maDec), &maDec );
100 bool bRet = ( hResult == S_OK );
106 HRESULT hResult = VarDecDiv( &maDec,
const_cast<LPDECIMAL
>(&r.maDec), &maDec );
107 bool bRet = ( hResult == S_OK );
113 HRESULT hResult = VarDecMul( &maDec,
const_cast<LPDECIMAL
>(&r.maDec), &maDec );
114 bool bRet = ( hResult == S_OK );
120 HRESULT hResult = VarDecNeg( &maDec, &maDec );
121 bool bRet = ( hResult == S_OK );
135 HRESULT hResult = VarDecCmp(
const_cast<LPDECIMAL
>(&rLeft.maDec),
const_cast<LPDECIMAL
>(&rRight.maDec) );
142 VarDecFromUI2(
static_cast<sal_uInt16
>(val), &maDec );
147 VarDecFromUI1( val, &maDec );
152 VarDecFromI2(
static_cast<short>(val), &maDec );
157 VarDecFromI4(
static_cast<LONG>(val), &maDec);
162 VarDecFromUI2( val, &maDec );
167 VarDecFromUI4(
static_cast<ULONG
>(val), &maDec );
172 bool bRet = ( VarDecFromR4( val, &maDec ) == S_OK );
178 bool bRet = ( VarDecFromR8( val, &maDec ) == S_OK );
184 setLong(
static_cast<sal_Int32
>(val) );
189 setULong(
static_cast<sal_uInt32
>(val) );
196 static LCID nLANGID = MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US );
206 if( cDecimalSep !=
'.' || cThousandSep !=
',' )
208 int nLen = pOUString->getLength();
209 std::unique_ptr<sal_Unicode[]> pBuffer(
new sal_Unicode[nLen + 1]);
213 for(
int i = 0 ;
i < nLen ; ++
i )
216 if (c == cDecimalSep)
218 else if (c == cThousandSep)
223 hResult = VarDecFromStr( o3tl::toW(pBuffer.get()), nLANGID, 0, &maDec );
227 hResult = VarDecFromStr( o3tl::toW(pOUString->getStr()), nLANGID, 0, &maDec );
229 bRet = ( hResult == S_OK );
237 bool bRet = ( VarUI2FromDec( &maDec, &n ) == S_OK );
246 bool bRet = ( VarI2FromDec( &maDec, &rVal ) == S_OK );
252 bool bRet = ( VarI4FromDec( &maDec, &rVal ) == S_OK );
258 bool bRet = ( VarUI2FromDec( &maDec, &rVal ) == S_OK );
264 bool bRet = ( VarUI4FromDec( &maDec, &rVal ) == S_OK );
270 bool bRet = ( VarR4FromDec( &maDec, &rVal ) == S_OK );
276 bool bRet = ( VarR8FromDec( &maDec, &rVal ) == S_OK );
343 static LCID nLANGID = MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US );
345 sal::systools::BStr pBStr;
347 HRESULT hResult = VarBstrFromDec( &maDec, nLANGID, 0, &pBStr );
348 if( hResult == S_OK )
356 if( cDecimalSep !=
'.' || cThousandSep !=
',' )
360 while( (c = pBStr[
i]) != 0 )
363 pBStr[
i] = cDecimalSep;
365 pBStr[
i] = cThousandSep;
382 if( rpDecimal ==
nullptr )
414 pnDecRes->
setChar(
p->nChar );
break;
416 pnDecRes->
setByte(
p->nByte );
break;
419 pnDecRes->
setInt(
p->nInteger );
break;
424 pnDecRes->
setLong(
p->nLong );
break;
439 if( !pnDecRes->
setDouble(
static_cast<double>(
p->nInt64) ) )
445 if( !pnDecRes->
setDouble(
static_cast<double>(
p->uInt64) ) )
452 double dVal =
p->nDouble;
477 pnDecRes->
setChar( *
p->pChar );
break;
479 pnDecRes->
setByte( *
p->pByte );
break;
482 pnDecRes->
setInt( *
p->pInteger );
break;
484 pnDecRes->
setLong( *
p->pLong );
break;
493 aTmp.
nSingle = *
p->pSingle;
goto ref;
496 aTmp.
nDouble = *
p->pDouble;
goto ref;
499 aTmp.
nInt64 = *
p->pnInt64;
goto ref;
501 aTmp.
uInt64 = *
p->puInt64;
goto ref;
523 aTmp.
pChar = &
p->nChar;
goto direct;
525 aTmp.
pByte = &
p->nByte;
goto direct;
527 aTmp.
pULong = &
p->nULong;
goto direct;
530 aTmp.
pUShort = &
p->nUShort;
goto direct;
533 aTmp.
pInteger = &
p->nInteger;
goto direct;
535 aTmp.
pLong = &
p->nLong;
goto direct;
538 aTmp.
pnInt64 = &
p->nInt64;
goto direct;
540 aTmp.
puInt64 = &
p->uInt64;
goto direct;
550 if( pDec !=
p->pDecimal )
579 p->pOUString =
new OUString;
static void SetError(ErrCode)
bool operator-=(const SbxDecimal &r)
bool getChar(sal_Unicode &rVal)
bool getULong(sal_uInt32 &rVal)
void setByte(sal_uInt8 val)
void setLong(sal_Int32 val)
bool getShort(sal_Int16 &rVal)
void setDecimal(SbxDecimal const *pDecimal)
bool getLong(sal_Int32 &rVal)
void setUShort(sal_uInt16 val)
void setULong(sal_uInt32 val)
bool operator/=(const SbxDecimal &r)
void getString(OUString &rString)
bool getDouble(double &rVal)
bool operator*=(const SbxDecimal &r)
friend CmpResult compare(const SbxDecimal &rLeft, const SbxDecimal &rRight)
bool operator+=(const SbxDecimal &r)
bool setString(OUString *pOUString)
bool getSingle(float &rVal)
void setChar(sal_Unicode val)
void fillAutomationDecimal(css::bridge::oleautomation::Decimal &rAutomationDec)
bool setSingle(float val)
bool setDouble(double val)
bool getUShort(sal_uInt16 &rVal)
void setUInt(unsigned int val)
void setShort(sal_Int16 val)
void PutDecimal(css::bridge::oleautomation::Decimal const &rAutomationDec)
SbxDecimal * GetDecimal() const
#define ERRCODE_BASIC_NO_OBJECT
#define ERRCODE_BASIC_MATH_OVERFLOW
#define ERRCODE_BASIC_CONVERSION
double ImpCurrencyToDouble(const sal_Int64 r)
auto ImpDoubleToSalUInt64(double d)
sal_Int64 ImpDoubleToCurrency(double d)
void ImpGetIntntlSep(sal_Unicode &rcDecimalSep, sal_Unicode &rcThousandSep, sal_Unicode &rcDecimalSepAlt)
auto ImpDoubleToSalInt64(double d)
void ImpPutDecimal(SbxValues *p, SbxDecimal *pDec)
SbxDecimal::CmpResult compare(SAL_UNUSED_PARAMETER const SbxDecimal &, SAL_UNUSED_PARAMETER const SbxDecimal &)
void releaseDecimalPtr(SbxDecimal *&rpDecimal)
SbxDecimal * ImpCreateDecimal(SbxValues *p)
SbxDecimal * ImpGetDecimal(const SbxValues *p)