xref: /AOO41X/main/basic/source/sbx/sbxcurr.cxx (revision e1f63238eb022c8a12b30d46a012444ff20e0951)
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