1*e1f63238SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*e1f63238SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*e1f63238SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*e1f63238SAndrew Rist * distributed with this work for additional information 6*e1f63238SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*e1f63238SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*e1f63238SAndrew Rist * "License"); you may not use this file except in compliance 9*e1f63238SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*e1f63238SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*e1f63238SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*e1f63238SAndrew Rist * software distributed under the License is distributed on an 15*e1f63238SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*e1f63238SAndrew Rist * KIND, either express or implied. See the License for the 17*e1f63238SAndrew Rist * specific language governing permissions and limitations 18*e1f63238SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*e1f63238SAndrew Rist *************************************************************/ 21*e1f63238SAndrew Rist 22*e1f63238SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_basic.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <basic/sbx.hxx> 28cdf0e10cSrcweir #include <tools/errcode.hxx> 29cdf0e10cSrcweir 30cdf0e10cSrcweir #define _TLBIGINT_INT64 31cdf0e10cSrcweir #include <tools/bigint.hxx> 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <basic/sbxvar.hxx> 34cdf0e10cSrcweir #include "sbxconv.hxx" 35cdf0e10cSrcweir 36cdf0e10cSrcweir static ::rtl::OUString ImpCurrencyToString( const SbxINT64& ); 37cdf0e10cSrcweir static SbxINT64 ImpStringToCurrency( const ::rtl::OUString& ); 38cdf0e10cSrcweir 39cdf0e10cSrcweir SbxINT64 ImpGetCurrency( const SbxValues* p ) 40cdf0e10cSrcweir { 41cdf0e10cSrcweir SbxValues aTmp; 42cdf0e10cSrcweir SbxINT64 nRes; 43cdf0e10cSrcweir start: 44cdf0e10cSrcweir switch( +p->eType ) 45cdf0e10cSrcweir { 46cdf0e10cSrcweir case SbxNULL: 47cdf0e10cSrcweir SbxBase::SetError( SbxERR_CONVERSION ); 48cdf0e10cSrcweir case SbxEMPTY: 49cdf0e10cSrcweir nRes.SetNull(); break; 50cdf0e10cSrcweir case SbxCHAR: 51cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)p->nChar ); break; 52cdf0e10cSrcweir case SbxBYTE: 53cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)p->nByte ); break; 54cdf0e10cSrcweir case SbxINTEGER: 55cdf0e10cSrcweir case SbxBOOL: 56cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)p->nInteger ); break; 57cdf0e10cSrcweir case SbxERROR: 58cdf0e10cSrcweir case SbxUSHORT: 59cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)p->nUShort ); break; 60cdf0e10cSrcweir case SbxCURRENCY: 61cdf0e10cSrcweir nRes = p->nLong64; break; 62cdf0e10cSrcweir case SbxLONG: 63cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)p->nLong ); 64cdf0e10cSrcweir break; 65cdf0e10cSrcweir case SbxULONG: 66cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)p->nULong ); 67cdf0e10cSrcweir break; 68cdf0e10cSrcweir case SbxSALINT64: 69cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)p->nInt64 ); 70cdf0e10cSrcweir break; 71cdf0e10cSrcweir case SbxSALUINT64: 72cdf0e10cSrcweir nRes = ImpDoubleToCurrency( ImpSalUInt64ToDouble( p->uInt64 ) ); 73cdf0e10cSrcweir break; 74cdf0e10cSrcweir case SbxSINGLE: 75cdf0e10cSrcweir if( p->nSingle > SbxMAXCURR ) 76cdf0e10cSrcweir { 77cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax(); 78cdf0e10cSrcweir } 79cdf0e10cSrcweir else if( p->nSingle < SbxMINCURR ) 80cdf0e10cSrcweir { 81cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin(); 82cdf0e10cSrcweir } 83cdf0e10cSrcweir else 84cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)p->nSingle ); 85cdf0e10cSrcweir break; 86cdf0e10cSrcweir case SbxDATE: 87cdf0e10cSrcweir case SbxDOUBLE: 88cdf0e10cSrcweir if( p->nDouble > SbxMAXCURR ) 89cdf0e10cSrcweir { 90cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax(); 91cdf0e10cSrcweir } 92cdf0e10cSrcweir else if( p->nDouble < SbxMINCURR ) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin(); 95cdf0e10cSrcweir } 96cdf0e10cSrcweir else 97cdf0e10cSrcweir nRes = ImpDoubleToCurrency( p->nDouble ); 98cdf0e10cSrcweir break; 99cdf0e10cSrcweir case SbxDECIMAL: 100cdf0e10cSrcweir case SbxBYREF | SbxDECIMAL: 101cdf0e10cSrcweir { 102cdf0e10cSrcweir double d = 0.0; 103cdf0e10cSrcweir if( p->pDecimal ) 104cdf0e10cSrcweir p->pDecimal->getDouble( d ); 105cdf0e10cSrcweir if( d > SbxMAXCURR ) 106cdf0e10cSrcweir { 107cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax(); 108cdf0e10cSrcweir } 109cdf0e10cSrcweir else if( d < SbxMINCURR ) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin(); 112cdf0e10cSrcweir } 113cdf0e10cSrcweir else 114cdf0e10cSrcweir nRes = ImpDoubleToCurrency( d ); 115cdf0e10cSrcweir break; 116cdf0e10cSrcweir } 117cdf0e10cSrcweir case SbxBYREF | SbxSTRING: 118cdf0e10cSrcweir case SbxSTRING: 119cdf0e10cSrcweir case SbxLPSTR: 120cdf0e10cSrcweir if( !p->pOUString ) 121cdf0e10cSrcweir nRes.SetNull(); 122cdf0e10cSrcweir else 123cdf0e10cSrcweir nRes = ImpStringToCurrency( *p->pOUString ); 124cdf0e10cSrcweir break; 125cdf0e10cSrcweir case SbxOBJECT: 126cdf0e10cSrcweir { 127cdf0e10cSrcweir SbxValue* pVal = PTR_CAST(SbxValue,p->pObj); 128cdf0e10cSrcweir if( pVal ) 129cdf0e10cSrcweir nRes = pVal->GetCurrency(); 130cdf0e10cSrcweir else 131cdf0e10cSrcweir { 132cdf0e10cSrcweir SbxBase::SetError( SbxERR_NO_OBJECT ); nRes.SetNull(); 133cdf0e10cSrcweir } 134cdf0e10cSrcweir break; 135cdf0e10cSrcweir } 136cdf0e10cSrcweir 137cdf0e10cSrcweir case SbxBYREF | SbxCHAR: 138cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)*p->pChar ); break; 139cdf0e10cSrcweir case SbxBYREF | SbxBYTE: 140cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)*p->pByte ); break; 141cdf0e10cSrcweir case SbxBYREF | SbxINTEGER: 142cdf0e10cSrcweir case SbxBYREF | SbxBOOL: 143cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)*p->pInteger ); break; 144cdf0e10cSrcweir case SbxBYREF | SbxERROR: 145cdf0e10cSrcweir case SbxBYREF | SbxUSHORT: 146cdf0e10cSrcweir nRes = ImpDoubleToCurrency( (double)*p->pUShort ); break; 147cdf0e10cSrcweir case SbxBYREF | SbxCURRENCY: 148cdf0e10cSrcweir nRes = *p->pLong64; break; 149cdf0e10cSrcweir 150cdf0e10cSrcweir // ab hier muss getestet werden 151cdf0e10cSrcweir case SbxBYREF | SbxLONG: 152cdf0e10cSrcweir aTmp.nLong = *p->pLong; goto ref; 153cdf0e10cSrcweir case SbxBYREF | SbxULONG: 154cdf0e10cSrcweir aTmp.nULong = *p->pULong; goto ref; 155cdf0e10cSrcweir case SbxBYREF | SbxSINGLE: 156cdf0e10cSrcweir aTmp.nSingle = *p->pSingle; goto ref; 157cdf0e10cSrcweir case SbxBYREF | SbxDATE: 158cdf0e10cSrcweir case SbxBYREF | SbxDOUBLE: 159cdf0e10cSrcweir aTmp.nDouble = *p->pDouble; goto ref; 160cdf0e10cSrcweir case SbxBYREF | SbxSALINT64: 161cdf0e10cSrcweir aTmp.nInt64 = *p->pnInt64; goto ref; 162cdf0e10cSrcweir case SbxBYREF | SbxSALUINT64: 163cdf0e10cSrcweir aTmp.uInt64 = *p->puInt64; goto ref; 164cdf0e10cSrcweir ref: 165cdf0e10cSrcweir aTmp.eType = SbxDataType( p->eType & 0x0FFF ); 166cdf0e10cSrcweir p = &aTmp; goto start; 167cdf0e10cSrcweir 168cdf0e10cSrcweir default: 169cdf0e10cSrcweir SbxBase::SetError( SbxERR_CONVERSION ); nRes.SetNull(); 170cdf0e10cSrcweir } 171cdf0e10cSrcweir return nRes; 172cdf0e10cSrcweir } 173cdf0e10cSrcweir 174cdf0e10cSrcweir void ImpPutCurrency( SbxValues* p, const SbxINT64 &r ) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir double dVal = ImpCurrencyToDouble( r ); 177cdf0e10cSrcweir SbxValues aTmp; 178cdf0e10cSrcweir start: 179cdf0e10cSrcweir switch( +p->eType ) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir // Hier sind Tests notwendig 182cdf0e10cSrcweir case SbxCHAR: 183cdf0e10cSrcweir aTmp.pChar = &p->nChar; goto direct; 184cdf0e10cSrcweir case SbxBYTE: 185cdf0e10cSrcweir aTmp.pByte = &p->nByte; goto direct; 186cdf0e10cSrcweir case SbxINTEGER: 187cdf0e10cSrcweir case SbxBOOL: 188cdf0e10cSrcweir aTmp.pInteger = &p->nInteger; goto direct; 189cdf0e10cSrcweir case SbxLONG: 190cdf0e10cSrcweir aTmp.pLong = &p->nLong; goto direct; 191cdf0e10cSrcweir case SbxULONG: 192cdf0e10cSrcweir aTmp.pULong = &p->nULong; goto direct; 193cdf0e10cSrcweir case SbxERROR: 194cdf0e10cSrcweir case SbxUSHORT: 195cdf0e10cSrcweir aTmp.pUShort = &p->nUShort; goto direct; 196cdf0e10cSrcweir direct: 197cdf0e10cSrcweir aTmp.eType = SbxDataType( p->eType | SbxBYREF ); 198cdf0e10cSrcweir p = &aTmp; goto start; 199cdf0e10cSrcweir 200cdf0e10cSrcweir // ab hier nicht mehr 201cdf0e10cSrcweir case SbxSINGLE: 202cdf0e10cSrcweir p->nSingle = (float)dVal; break; 203cdf0e10cSrcweir case SbxDATE: 204cdf0e10cSrcweir case SbxDOUBLE: 205cdf0e10cSrcweir p->nDouble = dVal; break; 206cdf0e10cSrcweir case SbxSALINT64: 207cdf0e10cSrcweir p->nInt64 = ImpDoubleToSalInt64( dVal ); break; 208cdf0e10cSrcweir case SbxSALUINT64: 209cdf0e10cSrcweir p->uInt64 = ImpDoubleToSalUInt64( dVal ); break; 210cdf0e10cSrcweir case SbxCURRENCY: 211cdf0e10cSrcweir p->nLong64 = r; break; 212cdf0e10cSrcweir case SbxDECIMAL: 213cdf0e10cSrcweir case SbxBYREF | SbxDECIMAL: 214cdf0e10cSrcweir { 215cdf0e10cSrcweir SbxDecimal* pDec = ImpCreateDecimal( p ); 216cdf0e10cSrcweir if( !pDec->setDouble( dVal ) ) 217cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); 218cdf0e10cSrcweir break; 219cdf0e10cSrcweir } 220cdf0e10cSrcweir case SbxBYREF | SbxSTRING: 221cdf0e10cSrcweir case SbxSTRING: 222cdf0e10cSrcweir case SbxLPSTR: 223cdf0e10cSrcweir if( !p->pOUString ) 224cdf0e10cSrcweir p->pOUString = new ::rtl::OUString; 225cdf0e10cSrcweir 226cdf0e10cSrcweir *p->pOUString = ImpCurrencyToString( r ); 227cdf0e10cSrcweir break; 228cdf0e10cSrcweir case SbxOBJECT: 229cdf0e10cSrcweir { 230cdf0e10cSrcweir SbxValue* pVal = PTR_CAST(SbxValue,p->pObj); 231cdf0e10cSrcweir if( pVal ) 232cdf0e10cSrcweir pVal->PutCurrency( r ); 233cdf0e10cSrcweir else 234cdf0e10cSrcweir SbxBase::SetError( SbxERR_NO_OBJECT ); 235cdf0e10cSrcweir break; 236cdf0e10cSrcweir } 237cdf0e10cSrcweir case SbxBYREF | SbxCHAR: 238cdf0e10cSrcweir if( dVal > SbxMAXCHAR ) 239cdf0e10cSrcweir { 240cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXCHAR; 241cdf0e10cSrcweir } 242cdf0e10cSrcweir else if( dVal < SbxMINCHAR ) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMINCHAR; 245cdf0e10cSrcweir } 246cdf0e10cSrcweir *p->pChar = (xub_Unicode) dVal; break; 247cdf0e10cSrcweir case SbxBYREF | SbxBYTE: 248cdf0e10cSrcweir if( dVal > SbxMAXBYTE ) 249cdf0e10cSrcweir { 250cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXBYTE; 251cdf0e10cSrcweir } 252cdf0e10cSrcweir else if( dVal < 0 ) 253cdf0e10cSrcweir { 254cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0; 255cdf0e10cSrcweir } 256cdf0e10cSrcweir *p->pByte = (sal_uInt8) dVal; break; 257cdf0e10cSrcweir case SbxBYREF | SbxINTEGER: 258cdf0e10cSrcweir case SbxBYREF | SbxBOOL: 259cdf0e10cSrcweir if( dVal > SbxMAXINT ) 260cdf0e10cSrcweir { 261cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXINT; 262cdf0e10cSrcweir } 263cdf0e10cSrcweir else if( dVal < SbxMININT ) 264cdf0e10cSrcweir { 265cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMININT; 266cdf0e10cSrcweir } 267cdf0e10cSrcweir *p->pInteger = (sal_Int16) dVal; break; 268cdf0e10cSrcweir case SbxBYREF | SbxERROR: 269cdf0e10cSrcweir case SbxBYREF | SbxUSHORT: 270cdf0e10cSrcweir if( dVal > SbxMAXUINT ) 271cdf0e10cSrcweir { 272cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXUINT; 273cdf0e10cSrcweir } 274cdf0e10cSrcweir else if( dVal < 0 ) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0; 277cdf0e10cSrcweir } 278cdf0e10cSrcweir *p->pUShort = (sal_uInt16) dVal; break; 279cdf0e10cSrcweir case SbxBYREF | SbxLONG: 280cdf0e10cSrcweir if( dVal > SbxMAXLNG ) 281cdf0e10cSrcweir { 282cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXLNG; 283cdf0e10cSrcweir } 284cdf0e10cSrcweir else if( dVal < SbxMINLNG ) 285cdf0e10cSrcweir { 286cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMINLNG; 287cdf0e10cSrcweir } 288cdf0e10cSrcweir *p->pLong = (sal_Int32) dVal; break; 289cdf0e10cSrcweir case SbxBYREF | SbxULONG: 290cdf0e10cSrcweir if( dVal > SbxMAXULNG ) 291cdf0e10cSrcweir { 292cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXULNG; 293cdf0e10cSrcweir } 294cdf0e10cSrcweir else if( dVal < 0 ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0; 297cdf0e10cSrcweir } 298cdf0e10cSrcweir *p->pULong = (sal_uInt32) dVal; break; 299cdf0e10cSrcweir case SbxBYREF | SbxSALINT64: 300cdf0e10cSrcweir *p->pnInt64 = ImpDoubleToSalInt64( dVal ); break; 301cdf0e10cSrcweir case SbxBYREF | SbxSALUINT64: 302cdf0e10cSrcweir *p->puInt64 = ImpDoubleToSalUInt64( dVal ); break; 303cdf0e10cSrcweir case SbxBYREF | SbxSINGLE: 304cdf0e10cSrcweir *p->pSingle = (float) dVal; break; 305cdf0e10cSrcweir case SbxBYREF | SbxDATE: 306cdf0e10cSrcweir case SbxBYREF | SbxDOUBLE: 307cdf0e10cSrcweir *p->pDouble = (double) dVal; break; 308cdf0e10cSrcweir case SbxBYREF | SbxCURRENCY: 309cdf0e10cSrcweir *p->pLong64 = r; break; 310cdf0e10cSrcweir 311cdf0e10cSrcweir default: 312cdf0e10cSrcweir SbxBase::SetError( SbxERR_CONVERSION ); 313cdf0e10cSrcweir } 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir // Hilfs-Funktionen zur Wandlung 317cdf0e10cSrcweir 318cdf0e10cSrcweir static ::rtl::OUString ImpCurrencyToString( const SbxINT64 &r ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir BigInt a10000 = 10000; 321cdf0e10cSrcweir 322cdf0e10cSrcweir //return GetpApp()->GetAppInternational().GetCurr( BigInt( r ), 4 ); 323cdf0e10cSrcweir BigInt aInt( r ); 324cdf0e10cSrcweir aInt.Abs(); 325cdf0e10cSrcweir BigInt aFrac = aInt; 326cdf0e10cSrcweir aInt /= a10000; 327cdf0e10cSrcweir aFrac %= a10000; 328cdf0e10cSrcweir aFrac += a10000; 329cdf0e10cSrcweir 330cdf0e10cSrcweir ::rtl::OUString aString; 331cdf0e10cSrcweir if( r.nHigh < 0 ) 332cdf0e10cSrcweir aString = ::rtl::OUString( (sal_Unicode)'-' ); 333cdf0e10cSrcweir aString += aInt.GetString(); 334cdf0e10cSrcweir aString += ::rtl::OUString( (sal_Unicode)'.' ); 335cdf0e10cSrcweir aString += aFrac.GetString().GetBuffer()+1; 336cdf0e10cSrcweir return aString; 337cdf0e10cSrcweir } 338cdf0e10cSrcweir 339cdf0e10cSrcweir static SbxINT64 ImpStringToCurrency( const ::rtl::OUString &r ) 340cdf0e10cSrcweir { 341cdf0e10cSrcweir int nDec = 4; 342cdf0e10cSrcweir String aStr; 343cdf0e10cSrcweir const sal_Unicode* p = r.getStr(); 344cdf0e10cSrcweir 345cdf0e10cSrcweir if( *p == '-' ) 346cdf0e10cSrcweir aStr += *p++; 347cdf0e10cSrcweir 348cdf0e10cSrcweir while( *p >= '0' && *p <= '9' ) { 349cdf0e10cSrcweir aStr += *p++; 350cdf0e10cSrcweir if( *p == ',' ) 351cdf0e10cSrcweir p++; 352cdf0e10cSrcweir } 353cdf0e10cSrcweir 354cdf0e10cSrcweir if( *p == '.' ) { 355cdf0e10cSrcweir p++; 356cdf0e10cSrcweir while( nDec && *p >= '0' && *p <= '9' ) { 357cdf0e10cSrcweir aStr += *p++; 358cdf0e10cSrcweir nDec--; 359cdf0e10cSrcweir } 360cdf0e10cSrcweir } 361cdf0e10cSrcweir while( nDec ) { 362cdf0e10cSrcweir aStr += '0'; 363cdf0e10cSrcweir nDec--; 364cdf0e10cSrcweir } 365cdf0e10cSrcweir 366cdf0e10cSrcweir BigInt aBig( aStr ); 367cdf0e10cSrcweir SbxINT64 nRes; 368cdf0e10cSrcweir aBig.INT64( &nRes ); 369cdf0e10cSrcweir return nRes; 370cdf0e10cSrcweir } 371cdf0e10cSrcweir 372cdf0e10cSrcweir double ImpINT64ToDouble( const SbxINT64 &r ) 373cdf0e10cSrcweir { return (double)r.nHigh*(double)4294967296.0 + (double)r.nLow; } 374cdf0e10cSrcweir 375cdf0e10cSrcweir SbxINT64 ImpDoubleToINT64( double d ) 376cdf0e10cSrcweir { 377cdf0e10cSrcweir SbxINT64 nRes; 378cdf0e10cSrcweir nRes.Set( d ); 379cdf0e10cSrcweir return nRes; 380cdf0e10cSrcweir } 381cdf0e10cSrcweir 382cdf0e10cSrcweir double ImpUINT64ToDouble( const SbxUINT64 &r ) 383cdf0e10cSrcweir { return (double)r.nHigh*(double)4294967296.0 + (double)r.nLow; } 384cdf0e10cSrcweir 385cdf0e10cSrcweir SbxUINT64 ImpDoubleToUINT64( double d ) 386cdf0e10cSrcweir { 387cdf0e10cSrcweir SbxUINT64 nRes; 388cdf0e10cSrcweir nRes.Set( d ); 389cdf0e10cSrcweir return nRes; 390cdf0e10cSrcweir } 391cdf0e10cSrcweir 392