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
ImpGetCurrency(const SbxValues * p)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
ImpPutCurrency(SbxValues * p,const SbxINT64 & r)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
ImpCurrencyToString(const SbxINT64 & r)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
ImpStringToCurrency(const::rtl::OUString & r)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
ImpINT64ToDouble(const SbxINT64 & r)372cdf0e10cSrcweir double ImpINT64ToDouble( const SbxINT64 &r )
373cdf0e10cSrcweir { return (double)r.nHigh*(double)4294967296.0 + (double)r.nLow; }
374cdf0e10cSrcweir
ImpDoubleToINT64(double d)375cdf0e10cSrcweir SbxINT64 ImpDoubleToINT64( double d )
376cdf0e10cSrcweir {
377cdf0e10cSrcweir SbxINT64 nRes;
378cdf0e10cSrcweir nRes.Set( d );
379cdf0e10cSrcweir return nRes;
380cdf0e10cSrcweir }
381cdf0e10cSrcweir
ImpUINT64ToDouble(const SbxUINT64 & r)382cdf0e10cSrcweir double ImpUINT64ToDouble( const SbxUINT64 &r )
383cdf0e10cSrcweir { return (double)r.nHigh*(double)4294967296.0 + (double)r.nLow; }
384cdf0e10cSrcweir
ImpDoubleToUINT64(double d)385cdf0e10cSrcweir SbxUINT64 ImpDoubleToUINT64( double d )
386cdf0e10cSrcweir {
387cdf0e10cSrcweir SbxUINT64 nRes;
388cdf0e10cSrcweir nRes.Set( d );
389cdf0e10cSrcweir return nRes;
390cdf0e10cSrcweir }
391cdf0e10cSrcweir
392