xref: /trunk/main/basic/source/sbx/sbxcurr.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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 }
391