xref: /aoo4110/main/basic/source/sbx/sbxform.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_basic.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <stdlib.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <basic/sbxform.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski /*
32*b1cdbd2cSJim Jagielski TODO: gibt es noch irgend welche Star-Basic Besonderheiten ?
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski 		was bedeutet: * als Platzhalter
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski BEMERKUNG: Visual-Basic behandelt folgende (ung"ultige) Format-Strings
37*b1cdbd2cSJim Jagielski 	  wie angezeigt:
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski 		##0##.##0##		--> ##000.000##
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski 	  (diese Klasse verh"alt sich genau so).
42*b1cdbd2cSJim Jagielski */
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <stdio.h>			// f"ur: sprintf()
45*b1cdbd2cSJim Jagielski #include <float.h>			// f"ur: DBL_DIG, DBL_EPSILON
46*b1cdbd2cSJim Jagielski #include <math.h>			// f"ur: floor(), fabs(), log10(), pow()
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski //=================================================================
49*b1cdbd2cSJim Jagielski //=========================== DEFINES =============================
50*b1cdbd2cSJim Jagielski //=================================================================
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #define _NO_DIGIT					-1
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #define MAX_NO_OF_EXP_DIGITS		5
55*b1cdbd2cSJim Jagielski 					// +4 wegen dem Wertebereich: zwischen -308 und +308
56*b1cdbd2cSJim Jagielski 					// +1 f"ur abschliessende 0
57*b1cdbd2cSJim Jagielski #define MAX_NO_OF_DIGITS			DBL_DIG
58*b1cdbd2cSJim Jagielski #define MAX_DOUBLE_BUFFER_LENGTH	MAX_NO_OF_DIGITS + 9
59*b1cdbd2cSJim Jagielski 					// +1 f"ur Vorzeichen
60*b1cdbd2cSJim Jagielski 					// +1 f"ur Ziffer vor dem Dezimal-Punkt
61*b1cdbd2cSJim Jagielski 					// +1 f"ur Dezimal-Punkt
62*b1cdbd2cSJim Jagielski 					// +2 f"ur Exponent E und Exp. Vorzeichen
63*b1cdbd2cSJim Jagielski 					// +3 f"ur den Wert des Exponenten
64*b1cdbd2cSJim Jagielski 					// +1 f"ur abschliessende 0
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski // Defines f"ur die Ziffern:
67*b1cdbd2cSJim Jagielski #define ASCII_0	  					'0'	// 48
68*b1cdbd2cSJim Jagielski #define ASCII_9						'9'	// 57
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski #define CREATE_1000SEP_CHAR 		'@'
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski #define FORMAT_SEPARATOR 			';'
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski // vordefinierte Formate f"ur den Format$()-Befehl:
75*b1cdbd2cSJim Jagielski #define BASICFORMAT_GENERALNUMBER	"General Number"
76*b1cdbd2cSJim Jagielski #define BASICFORMAT_CURRENCY		"Currency"
77*b1cdbd2cSJim Jagielski #define BASICFORMAT_FIXED			"Fixed"
78*b1cdbd2cSJim Jagielski #define BASICFORMAT_STANDARD		"Standard"
79*b1cdbd2cSJim Jagielski #define BASICFORMAT_PERCENT			"Percent"
80*b1cdbd2cSJim Jagielski #define BASICFORMAT_SCIENTIFIC		"Scientific"
81*b1cdbd2cSJim Jagielski #define BASICFORMAT_YESNO     		"Yes/No"
82*b1cdbd2cSJim Jagielski #define BASICFORMAT_TRUEFALSE  		"True/False"
83*b1cdbd2cSJim Jagielski #define BASICFORMAT_ONOFF	  		"On/Off"
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski #define EMPTYFORMATSTRING			""
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski // Bem.: Visual-Basic hat bei Floating-Point-Zahlen maximal 12 Stellen
88*b1cdbd2cSJim Jagielski //		 nach dem Dezimal-Punkt.
89*b1cdbd2cSJim Jagielski // Alle Format-Strings sind kompatibel zu Visual-Basic:
90*b1cdbd2cSJim Jagielski #define GENERALNUMBER_FORMAT		"0.############"
91*b1cdbd2cSJim Jagielski 			// max. 12 Stellen in Visual-Basic !
92*b1cdbd2cSJim Jagielski #define CURRENCY_FORMAT				"@$0.00;@($0.00)"
93*b1cdbd2cSJim Jagielski #define FIXED_FORMAT				"0.00"
94*b1cdbd2cSJim Jagielski #define STANDARD_FORMAT				"@0.00"
95*b1cdbd2cSJim Jagielski #define PERCENT_FORMAT				"0.00%"
96*b1cdbd2cSJim Jagielski #define SCIENTIFIC_FORMAT			"#.00E+00"
97*b1cdbd2cSJim Jagielski // BEMERKUNG: das Zeichen @ bedeutet, das Tausender-Separatoren erzeugt
98*b1cdbd2cSJim Jagielski //			  weden sollen. Dies ist eine StarBasic 'Erweiterung'.
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski //=================================================================
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski // zur Bestimmung der Anzahl Stellen in dNumber
get_number_of_digits(double dNumber)103*b1cdbd2cSJim Jagielski double get_number_of_digits( double dNumber )
104*b1cdbd2cSJim Jagielski //double floor_log10_fabs( double dNumber )
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski 	if( dNumber==0.0 )
107*b1cdbd2cSJim Jagielski 		// 0 hat zumindest auch eine Stelle !
108*b1cdbd2cSJim Jagielski 		return 0.0; //ehemals 1.0, jetzt 0.0 wegen #40025;
109*b1cdbd2cSJim Jagielski 	else
110*b1cdbd2cSJim Jagielski 		return floor( log10( fabs( dNumber ) ) );
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski //=================================================================
114*b1cdbd2cSJim Jagielski //======================= IMPLEMENTATION ==========================
115*b1cdbd2cSJim Jagielski //=================================================================
116*b1cdbd2cSJim Jagielski 
SbxBasicFormater(sal_Unicode _cDecPoint,sal_Unicode _cThousandSep,String _sOnStrg,String _sOffStrg,String _sYesStrg,String _sNoStrg,String _sTrueStrg,String _sFalseStrg,String _sCurrencyStrg,String _sCurrencyFormatStrg)117*b1cdbd2cSJim Jagielski SbxBasicFormater::SbxBasicFormater( sal_Unicode _cDecPoint, sal_Unicode _cThousandSep,
118*b1cdbd2cSJim Jagielski 					  String _sOnStrg,
119*b1cdbd2cSJim Jagielski 					  String _sOffStrg,
120*b1cdbd2cSJim Jagielski 					  String _sYesStrg,
121*b1cdbd2cSJim Jagielski 					  String _sNoStrg,
122*b1cdbd2cSJim Jagielski 					  String _sTrueStrg,
123*b1cdbd2cSJim Jagielski 					  String _sFalseStrg,
124*b1cdbd2cSJim Jagielski 					  String _sCurrencyStrg,
125*b1cdbd2cSJim Jagielski 					  String _sCurrencyFormatStrg )
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski 	cDecPoint = _cDecPoint;
128*b1cdbd2cSJim Jagielski 	cThousandSep = _cThousandSep;
129*b1cdbd2cSJim Jagielski 	sOnStrg = _sOnStrg;
130*b1cdbd2cSJim Jagielski 	sOffStrg = _sOffStrg;
131*b1cdbd2cSJim Jagielski 	sYesStrg = _sYesStrg;
132*b1cdbd2cSJim Jagielski 	sNoStrg = _sNoStrg;
133*b1cdbd2cSJim Jagielski 	sTrueStrg = _sTrueStrg;
134*b1cdbd2cSJim Jagielski 	sFalseStrg = _sFalseStrg;
135*b1cdbd2cSJim Jagielski 	sCurrencyStrg = _sCurrencyStrg;
136*b1cdbd2cSJim Jagielski 	sCurrencyFormatStrg = _sCurrencyFormatStrg;
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski // Funktion zur Ausgabe eines Fehler-Textes (zum Debuggen)
140*b1cdbd2cSJim Jagielski /*
141*b1cdbd2cSJim Jagielski void SbxBasicFormater::ShowError( char * sErrMsg )
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski //	cout << "ERROR in Format$(): " << sErrMsg << endl;
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski */
146*b1cdbd2cSJim Jagielski // verschiebt alle Zeichen des Strings, angefangen von der nStartPos,
147*b1cdbd2cSJim Jagielski // um eine Position zu gr"osseren Indizes, d.h. es wird Platz f"ur
148*b1cdbd2cSJim Jagielski // ein neues (einzuf"ugendes) Zeichen geschafft.
149*b1cdbd2cSJim Jagielski // ACHTUNG: der String MUSS gross genug sein !
ShiftString(String & sStrg,sal_uInt16 nStartPos)150*b1cdbd2cSJim Jagielski inline void SbxBasicFormater::ShiftString( String& sStrg, sal_uInt16 nStartPos )
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski 	sStrg.Erase( nStartPos,1 );
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski // Funktion um ein Zeichen an einen String anzuh"angen
StrAppendChar(String & sStrg,sal_Unicode ch)156*b1cdbd2cSJim Jagielski inline void SbxBasicFormater::StrAppendChar( String& sStrg, sal_Unicode ch )
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski 	sStrg.Insert( ch );
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski // h"angt die "ubergebene Ziffer nDigit an den "ubergebenen String sStrg
162*b1cdbd2cSJim Jagielski // an, dabei wird "uberpr"uft ob nDigit eine g"ultige Ziffer ist,
163*b1cdbd2cSJim Jagielski // falls dies nicht der Fall ist, wird nichts gemacht.
AppendDigit(String & sStrg,short nDigit)164*b1cdbd2cSJim Jagielski void SbxBasicFormater::AppendDigit( String& sStrg, short nDigit )
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski 	if( nDigit>=0 && nDigit<=9 )
167*b1cdbd2cSJim Jagielski 		StrAppendChar( sStrg, (sal_Unicode)(nDigit+ASCII_0) );
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski // verschiebt den Dezimal-Punkt um eine Stelle nach links
LeftShiftDecimalPoint(String & sStrg)171*b1cdbd2cSJim Jagielski void SbxBasicFormater::LeftShiftDecimalPoint( String& sStrg )
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = sStrg.Search( cDecPoint );
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	if( nPos!=STRING_NOTFOUND )
176*b1cdbd2cSJim Jagielski 	{
177*b1cdbd2cSJim Jagielski 		// vertausche Dezimal-Punkt
178*b1cdbd2cSJim Jagielski 		sStrg.SetChar( nPos, sStrg.GetChar( nPos - 1 ) );
179*b1cdbd2cSJim Jagielski 		sStrg.SetChar( nPos-1, cDecPoint );
180*b1cdbd2cSJim Jagielski 	}
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski // rundet in einem String die Ziffer an der angegebenen Stelle,
184*b1cdbd2cSJim Jagielski // es wird ein Flag zur"uckgeliefert, falls ein Overflow auftrat,
185*b1cdbd2cSJim Jagielski // d.h. 99.99 --> 100.00, d.h. ein Gr"ossenordung ge"andert wurde
186*b1cdbd2cSJim Jagielski // (geschieht beim Runden einer 9).
StrRoundDigit(String & sStrg,short nPos,sal_Bool & bOverflow)187*b1cdbd2cSJim Jagielski void SbxBasicFormater::StrRoundDigit( String& sStrg, short nPos, sal_Bool& bOverflow )
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski 	// wurde ggf ein falscher Index uebergeben --> Aufruf ignorieren
190*b1cdbd2cSJim Jagielski 	if( nPos<0 )
191*b1cdbd2cSJim Jagielski 		return;
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 	bOverflow = sal_False;
194*b1cdbd2cSJim Jagielski 	// "uberspringe den Dezimalpunkt und Tausender-Trennzeichen
195*b1cdbd2cSJim Jagielski 	sal_Unicode c = sStrg.GetChar( nPos );
196*b1cdbd2cSJim Jagielski 	if( nPos>0 && (c == cDecPoint || c == cThousandSep) )
197*b1cdbd2cSJim Jagielski 	{
198*b1cdbd2cSJim Jagielski 		StrRoundDigit( sStrg,nPos-1,bOverflow );
199*b1cdbd2cSJim Jagielski 		// AENDERUNG ab 9.3.1997: nach rekursivem Call die Methode SOFORT beenden !
200*b1cdbd2cSJim Jagielski 		return;
201*b1cdbd2cSJim Jagielski 	}
202*b1cdbd2cSJim Jagielski 	// "uberspringe alle nicht-Ziffern:
203*b1cdbd2cSJim Jagielski 	// BEMERKUNG:
204*b1cdbd2cSJim Jagielski 	// in einem g"ultigen Format-String sollte die Ausgabe
205*b1cdbd2cSJim Jagielski 	// der Zahl an einem St"uck geschen, d.h. Sonderzeichen sollten
206*b1cdbd2cSJim Jagielski 	// NUR vor ODER nach der Zahl stehen und nicht mitten in der
207*b1cdbd2cSJim Jagielski 	// Format-Angabe f"ur die Zahl
208*b1cdbd2cSJim Jagielski 	while( nPos>=0 && (sStrg.GetChar( nPos )<ASCII_0 || sStrg.GetChar( nPos )>ASCII_9) )
209*b1cdbd2cSJim Jagielski 		nPos--;
210*b1cdbd2cSJim Jagielski 	// muss ggf. noch Platz f"ur eine weitere (f"uhrende) Ziffer
211*b1cdbd2cSJim Jagielski 	// geschaffen werden ?
212*b1cdbd2cSJim Jagielski 	if( nPos==-1 )
213*b1cdbd2cSJim Jagielski 	{
214*b1cdbd2cSJim Jagielski 		ShiftString( sStrg,0 );
215*b1cdbd2cSJim Jagielski 		// f"uhrende 1 einf"ugen: z.B. 99.99 f"ur 0.0
216*b1cdbd2cSJim Jagielski 		sStrg.SetChar( 0, '1' );
217*b1cdbd2cSJim Jagielski 		bOverflow = sal_True;
218*b1cdbd2cSJim Jagielski 	}
219*b1cdbd2cSJim Jagielski 	else
220*b1cdbd2cSJim Jagielski 	{
221*b1cdbd2cSJim Jagielski 		// ist die zu rundende Position eine Ziffer ?
222*b1cdbd2cSJim Jagielski 		sal_Unicode c2 = sStrg.GetChar( nPos );
223*b1cdbd2cSJim Jagielski 		if( c2 >= ASCII_0 && c2 <= ASCII_9 )
224*b1cdbd2cSJim Jagielski 		{
225*b1cdbd2cSJim Jagielski 			// muss eine 9 gerundet werden? Falls: Ja --> rekursiver Aufruf
226*b1cdbd2cSJim Jagielski 			if( c2 == ASCII_9 )
227*b1cdbd2cSJim Jagielski 			{
228*b1cdbd2cSJim Jagielski 				sStrg.SetChar( nPos, '0' );
229*b1cdbd2cSJim Jagielski 				StrRoundDigit( sStrg,nPos-1,bOverflow );
230*b1cdbd2cSJim Jagielski 			}
231*b1cdbd2cSJim Jagielski 			else
232*b1cdbd2cSJim Jagielski 				sStrg.SetChar( nPos, c2+1 );
233*b1cdbd2cSJim Jagielski 		}
234*b1cdbd2cSJim Jagielski 		else
235*b1cdbd2cSJim Jagielski 		{
236*b1cdbd2cSJim Jagielski 		// --> Nein, d.h. Platz f"ur Ziffer schaffen: z.B. -99.99 f"ur #0.0
237*b1cdbd2cSJim Jagielski 			// da gerundet wird MUSS es immer eine g"ultige Position
238*b1cdbd2cSJim Jagielski 			// nPos+1 geben !
239*b1cdbd2cSJim Jagielski 			ShiftString( sStrg,nPos+1 );
240*b1cdbd2cSJim Jagielski 			// f"uhrende 1 einf"ugen
241*b1cdbd2cSJim Jagielski 			sStrg.SetChar( nPos+1, '1' );
242*b1cdbd2cSJim Jagielski 			bOverflow = sal_True;
243*b1cdbd2cSJim Jagielski 		}
244*b1cdbd2cSJim Jagielski 	}
245*b1cdbd2cSJim Jagielski }
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski // rundet in einem String die Ziffer an der angegebenen Stelle
StrRoundDigit(String & sStrg,short nPos)248*b1cdbd2cSJim Jagielski void SbxBasicFormater::StrRoundDigit( String& sStrg, short nPos )
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski 	sal_Bool bOverflow;
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 	StrRoundDigit( sStrg,nPos,bOverflow );
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski // parse den Formatstring von der "ubergebenen Position zur"uck
256*b1cdbd2cSJim Jagielski // und l"osche ggf. "uberf"ussige 0en, z.B. 4.50 in 0.0#
ParseBack(String & sStrg,const String & sFormatStrg,short nFormatPos)257*b1cdbd2cSJim Jagielski void SbxBasicFormater::ParseBack( String& sStrg, const String& sFormatStrg,
258*b1cdbd2cSJim Jagielski 								  short nFormatPos )
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski 	// WICHTIG: nFormatPos kann auch negativ sein, in diesem Fall Aufruf ignorieren
261*b1cdbd2cSJim Jagielski 	for( short i=nFormatPos;
262*b1cdbd2cSJim Jagielski 		 i>0 && sFormatStrg.GetChar( i ) == '#' && sStrg.GetChar( (sStrg.Len()-1) ) == '0';
263*b1cdbd2cSJim Jagielski 		 i-- )
264*b1cdbd2cSJim Jagielski 		 { sStrg.Erase( sStrg.Len()-1 ); }
265*b1cdbd2cSJim Jagielski }
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski #ifdef _with_sprintf
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski /*
270*b1cdbd2cSJim Jagielski 	Bemerkung:
271*b1cdbd2cSJim Jagielski 	Zahl wird mit maximaler (sinnvollen) Genauigkeit in einen String
272*b1cdbd2cSJim Jagielski 	umgewandelt (mit sprintf()), dieser String wird dann im Schleifen-
273*b1cdbd2cSJim Jagielski 	Durchlauf nach der entsprechenden Ziffer durchsucht.
274*b1cdbd2cSJim Jagielski */
275*b1cdbd2cSJim Jagielski // initialisiert die Daten der Klasse um einen Scan-Durchlauf durchzuf"uhren
InitScan(double _dNum)276*b1cdbd2cSJim Jagielski void SbxBasicFormater::InitScan( double _dNum )
277*b1cdbd2cSJim Jagielski {
278*b1cdbd2cSJim Jagielski 	char sBuffer[ MAX_DOUBLE_BUFFER_LENGTH ];
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 	dNum = _dNum;
281*b1cdbd2cSJim Jagielski 	InitExp( get_number_of_digits( dNum ) );
282*b1cdbd2cSJim Jagielski 	// maximal 15 Nachkomma-Stellen, Format-Beispiel: -1.234000000000000E-001
283*b1cdbd2cSJim Jagielski 	/*int nCount =*/ sprintf( sBuffer,"%+22.15lE",dNum );
284*b1cdbd2cSJim Jagielski 	sSciNumStrg.AssignAscii( sBuffer );
285*b1cdbd2cSJim Jagielski }
286*b1cdbd2cSJim Jagielski 
InitExp(double _dNewExp)287*b1cdbd2cSJim Jagielski void SbxBasicFormater::InitExp( double _dNewExp )
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski 	char sBuffer[ MAX_DOUBLE_BUFFER_LENGTH ];
290*b1cdbd2cSJim Jagielski 	// bestimme den Exponenten (kann immer GENAU durch int dargestellt werden)
291*b1cdbd2cSJim Jagielski 	nNumExp = (short)_dNewExp;
292*b1cdbd2cSJim Jagielski 	// und dessen String
293*b1cdbd2cSJim Jagielski 	/*int nCount =*/ sprintf( sBuffer,"%+i",nNumExp );
294*b1cdbd2cSJim Jagielski 	sNumExpStrg.AssignAscii( sBuffer );
295*b1cdbd2cSJim Jagielski 	// bestimme die Anzahl der Stellen im Exponenten
296*b1cdbd2cSJim Jagielski 	nExpExp = (short)get_number_of_digits( (double)nNumExp );
297*b1cdbd2cSJim Jagielski }
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski // bestimmt die Ziffer an der angegebenen Stelle (gedacht zur Anwendung im
300*b1cdbd2cSJim Jagielski // Scan-Durchlauf)
GetDigitAtPosScan(short nPos,sal_Bool & bFoundFirstDigit)301*b1cdbd2cSJim Jagielski short SbxBasicFormater::GetDigitAtPosScan( short nPos, sal_Bool& bFoundFirstDigit )
302*b1cdbd2cSJim Jagielski {
303*b1cdbd2cSJim Jagielski 	// Versuch eine gr"ossere Ziffer zu lesen,
304*b1cdbd2cSJim Jagielski 	// z.B. Stelle 4 in 1.234,
305*b1cdbd2cSJim Jagielski 	// oder eine Ziffer ausserhalb der Aufl"osung der
306*b1cdbd2cSJim Jagielski 	// Zahl (double) zu lesen (z.B. max. 15 Stellen).
307*b1cdbd2cSJim Jagielski 	if( nPos>nNumExp || abs(nNumExp-nPos)>MAX_NO_OF_DIGITS )
308*b1cdbd2cSJim Jagielski 		return _NO_DIGIT;
309*b1cdbd2cSJim Jagielski 	// bestimme den Index der Stelle in dem Number-String:
310*b1cdbd2cSJim Jagielski 	// "uberlese das Vorzeichen
311*b1cdbd2cSJim Jagielski 	sal_uInt16 no = 1;
312*b1cdbd2cSJim Jagielski 	// falls notwendig den Dezimal-Punkt "uberlesen:
313*b1cdbd2cSJim Jagielski 	if( nPos<nNumExp )
314*b1cdbd2cSJim Jagielski 		no++;
315*b1cdbd2cSJim Jagielski 	no += nNumExp-nPos;
316*b1cdbd2cSJim Jagielski 	// Abfrage der ersten (g"ultigen) Ziffer der Zahl --> Flag setzen
317*b1cdbd2cSJim Jagielski 	if( nPos==nNumExp )
318*b1cdbd2cSJim Jagielski 		bFoundFirstDigit = sal_True;
319*b1cdbd2cSJim Jagielski 	return (short)(sSciNumStrg.GetChar( no ) - ASCII_0);
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski 
GetDigitAtPosExpScan(short nPos,sal_Bool & bFoundFirstDigit)322*b1cdbd2cSJim Jagielski short SbxBasicFormater::GetDigitAtPosExpScan( short nPos, sal_Bool& bFoundFirstDigit )
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski 	// ist die abgefragte Stelle zu gross f"ur den Exponenten ?
325*b1cdbd2cSJim Jagielski 	if( nPos>nExpExp )
326*b1cdbd2cSJim Jagielski 		return -1;
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 	// bestimme den Index der Stelle in dem Number-String:
329*b1cdbd2cSJim Jagielski 	// "uberlese das Vorzeichen
330*b1cdbd2cSJim Jagielski 	sal_uInt16 no = 1;
331*b1cdbd2cSJim Jagielski 	no += nExpExp-nPos;
332*b1cdbd2cSJim Jagielski 	// Abfrage der ersten (g"ultigen) Ziffer der Zahl --> Flag setzen
333*b1cdbd2cSJim Jagielski 	if( nPos==nExpExp )
334*b1cdbd2cSJim Jagielski 		bFoundFirstDigit = sal_True;
335*b1cdbd2cSJim Jagielski 	return (short)(sNumExpStrg.GetChar( no ) - ASCII_0);
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski // es kann ein Wert f"ur den Exponent angegeben werden, da ggf. die
339*b1cdbd2cSJim Jagielski // Zahl ggf. NICHT normiert (z.B. 1.2345e-03) dargestellt werden soll,
340*b1cdbd2cSJim Jagielski // sondern eventuell 123.345e-3 !
GetDigitAtPosExpScan(double dNewExponent,short nPos,sal_Bool & bFoundFirstDigit)341*b1cdbd2cSJim Jagielski short SbxBasicFormater::GetDigitAtPosExpScan( double dNewExponent, short nPos,
342*b1cdbd2cSJim Jagielski 											  sal_Bool& bFoundFirstDigit )
343*b1cdbd2cSJim Jagielski {
344*b1cdbd2cSJim Jagielski 	// neuer Exponent wurde "ubergeben, aktualisiere
345*b1cdbd2cSJim Jagielski 	// die tempor"aren Klassen-Variablen
346*b1cdbd2cSJim Jagielski 	InitExp( dNewExponent );
347*b1cdbd2cSJim Jagielski 	// und jetzt die Stelle bestimmen
348*b1cdbd2cSJim Jagielski 	return GetDigitAtPosExpScan( nPos,bFoundFirstDigit );
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski #else
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski /* Probleme mit der folgenden Methode:
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski TODO: ggf einen 'intelligenten' Peek-Parser um Rundungsfehler bei
356*b1cdbd2cSJim Jagielski 	  double-Zahlen herauszufinden ? z.B. f"ur  0.00115 #.#e-000
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski   Problem mit: format( 0.3345 ,  "0.000" )
359*b1cdbd2cSJim Jagielski   Problem mit: format( 0.00115 , "0.0000" )
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski */
362*b1cdbd2cSJim Jagielski // liefert die Ziffer an der angegebenen '10er System'-Position,
363*b1cdbd2cSJim Jagielski // d.h. positive nPos f"ur Stellen vor dem Komma und negative
364*b1cdbd2cSJim Jagielski // f"ur Stellen nach dem Komma.
365*b1cdbd2cSJim Jagielski // nPos==0 bedeutet erste Stelle vor dem Komma, also 10^0.
366*b1cdbd2cSJim Jagielski // liefert 0..9 f"ur g"ultige Ziffern und -1 f"ur nicht vorhanden,
367*b1cdbd2cSJim Jagielski // d.h. falls die "ubergebene Zahl zu klein ist
368*b1cdbd2cSJim Jagielski // (z.B. Stelle 5 bei dNumber=123).
369*b1cdbd2cSJim Jagielski // Weiter wird in dNextNumber die um die f"uhrenden Stellen
370*b1cdbd2cSJim Jagielski // (bis nPos) gek"urzte Zahl zur"uckgeliefert, z.B.
371*b1cdbd2cSJim Jagielski //   GetDigitAtPos( 3434.565 , 2 , dNewNumber ) --> dNewNumber = 434.565
372*b1cdbd2cSJim Jagielski // dies kann f"ur Schleifenabarbeitung g"unstiger sein, d.h.
373*b1cdbd2cSJim Jagielski // die Zahlen immer von der gr"ossten Stelle abarbeiten/scanen.
374*b1cdbd2cSJim Jagielski // In bFoundFirstDigit wird ggf. ein Flag gesetzt wenn eine Ziffer
375*b1cdbd2cSJim Jagielski // gefunden wurde, dies wird dazu verwendet um 'Fehler' beim Parsen 202
376*b1cdbd2cSJim Jagielski // zu vermeiden, die
377*b1cdbd2cSJim Jagielski //
378*b1cdbd2cSJim Jagielski // ACHTUNG: anscheinend gibt es manchmal noch Probleme mit Rundungs-Fehlern!
GetDigitAtPos(double dNumber,short nPos,double & dNextNumber,sal_Bool & bFoundFirstDigit)379*b1cdbd2cSJim Jagielski short SbxBasicFormater::GetDigitAtPos( double dNumber, short nPos,
380*b1cdbd2cSJim Jagielski 								double& dNextNumber, sal_Bool& bFoundFirstDigit )
381*b1cdbd2cSJim Jagielski // ACHTUNG: nPos kann auch negativ werden, f"ur Stellen nach dem Dezimal-Punkt
382*b1cdbd2cSJim Jagielski {
383*b1cdbd2cSJim Jagielski 	double dTemp = dNumber;
384*b1cdbd2cSJim Jagielski 	double dDigit,dPos;
385*b1cdbd2cSJim Jagielski 	short  nMaxDigit;
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski 	// erst mal aus der Zahl eine positive Zahl machen:
388*b1cdbd2cSJim Jagielski 	dNumber = fabs( dNumber );
389*b1cdbd2cSJim Jagielski 	dPos = (double)nPos;
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski 	// "uberpr"ufe ob Zahl zu klein f"ur angegebene Stelle ist
392*b1cdbd2cSJim Jagielski 	nMaxDigit = (short)get_number_of_digits( dNumber );
393*b1cdbd2cSJim Jagielski 	// f"uhrende Ziffern 'l"oschen'
394*b1cdbd2cSJim Jagielski 	// Bem.: Fehler nur bei Zahlen gr"osser 0, d.h. bei Ziffern vor dem
395*b1cdbd2cSJim Jagielski 	//		 Dezimal-Punkt
396*b1cdbd2cSJim Jagielski 	if( nMaxDigit<nPos && !bFoundFirstDigit && nPos>=0 )
397*b1cdbd2cSJim Jagielski 		return _NO_DIGIT;
398*b1cdbd2cSJim Jagielski 	// Ziffer gefunden, setze Flag:
399*b1cdbd2cSJim Jagielski 	bFoundFirstDigit = sal_True;
400*b1cdbd2cSJim Jagielski 	for( short i=nMaxDigit; i>=nPos; i-- )
401*b1cdbd2cSJim Jagielski 	{
402*b1cdbd2cSJim Jagielski 		double dI = (double)i;
403*b1cdbd2cSJim Jagielski 		double dTemp1 = pow( 10.0,dI );
404*b1cdbd2cSJim Jagielski 		// pr"apariere nun die gesuchte Ziffer:
405*b1cdbd2cSJim Jagielski 		dDigit = floor( pow( 10.0,log10( fabs( dNumber ) )-dI ) );
406*b1cdbd2cSJim Jagielski 		dNumber -= dTemp1 * dDigit;
407*b1cdbd2cSJim Jagielski 	}
408*b1cdbd2cSJim Jagielski 		// Zuweisung f"ur optimierte Schleifen-Durchl"aufe
409*b1cdbd2cSJim Jagielski 	dNextNumber = dNumber;
410*b1cdbd2cSJim Jagielski 	// und zum Schluss noch die float-Rundungsungenauigkeiten heraus filtern
411*b1cdbd2cSJim Jagielski 	return RoundDigit( dDigit );
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski // rundet eine double-Zahl zwischen 0 und 9 auf die genaue
415*b1cdbd2cSJim Jagielski // Integer-Zahl, z.B. 2.8 -> 3 und 2.2 -> 2
RoundDigit(double dNumber)416*b1cdbd2cSJim Jagielski short SbxBasicFormater::RoundDigit( double dNumber )
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski 	// ist der Wertebereich g"ultig ?
419*b1cdbd2cSJim Jagielski 	if( dNumber<0.0 || dNumber>10.0 )
420*b1cdbd2cSJim Jagielski 		return -1;
421*b1cdbd2cSJim Jagielski 	short nTempHigh = (short)(dNumber+0.5);	// ggf. floor( )
422*b1cdbd2cSJim Jagielski 	return nTempHigh;
423*b1cdbd2cSJim Jagielski }
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski #endif
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski // kopiert den entsprechenden Teil des Format-Strings, falls vorhanden,
428*b1cdbd2cSJim Jagielski // und liefert diesen zur"uck.
429*b1cdbd2cSJim Jagielski // Somit wird ein neuer String erzeugt, der vom Aufrufer wieder freigegeben
430*b1cdbd2cSJim Jagielski // werden muss
GetPosFormatString(const String & sFormatStrg,sal_Bool & bFound)431*b1cdbd2cSJim Jagielski String SbxBasicFormater::GetPosFormatString( const String& sFormatStrg, sal_Bool & bFound )
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski 	bFound = sal_False;		// default...
434*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = sFormatStrg.Search( FORMAT_SEPARATOR );
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski 	if( nPos!=STRING_NOTFOUND )
437*b1cdbd2cSJim Jagielski 	{
438*b1cdbd2cSJim Jagielski 		bFound = sal_True;
439*b1cdbd2cSJim Jagielski 		// der Format-String f"ur die positiven Zahlen ist alles
440*b1cdbd2cSJim Jagielski 		// vor dem ersten ';'
441*b1cdbd2cSJim Jagielski 		return sFormatStrg.Copy( 0,nPos );
442*b1cdbd2cSJim Jagielski 	}
443*b1cdbd2cSJim Jagielski 	// kein ; gefunden, liefere Leerstring
444*b1cdbd2cSJim Jagielski 	String aRetStr;
445*b1cdbd2cSJim Jagielski 	aRetStr.AssignAscii( EMPTYFORMATSTRING );
446*b1cdbd2cSJim Jagielski 	return aRetStr;
447*b1cdbd2cSJim Jagielski }
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski // siehe auch GetPosFormatString()
GetNegFormatString(const String & sFormatStrg,sal_Bool & bFound)450*b1cdbd2cSJim Jagielski String SbxBasicFormater::GetNegFormatString( const String& sFormatStrg, sal_Bool & bFound )
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski 	bFound = sal_False;		// default...
453*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = sFormatStrg.Search( FORMAT_SEPARATOR );
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 	if( nPos!=STRING_NOTFOUND )
456*b1cdbd2cSJim Jagielski 	{
457*b1cdbd2cSJim Jagielski 		// der Format-String f"ur die negative Zahlen ist alles
458*b1cdbd2cSJim Jagielski 		// zwischen dem ersten und dem zweiten ';'.
459*b1cdbd2cSJim Jagielski 		// Daher: hole erst mal alles nach dem ersten ';'
460*b1cdbd2cSJim Jagielski 		String sTempStrg = sFormatStrg.Copy( nPos+1 );
461*b1cdbd2cSJim Jagielski 		// und suche darin ggf. ein weiteres ';'
462*b1cdbd2cSJim Jagielski 		nPos = sTempStrg.Search( FORMAT_SEPARATOR );
463*b1cdbd2cSJim Jagielski 		bFound = sal_True;
464*b1cdbd2cSJim Jagielski 		if( nPos==STRING_NOTFOUND )
465*b1cdbd2cSJim Jagielski 			// keins gefunden, liefere alles...
466*b1cdbd2cSJim Jagielski 			return sTempStrg;
467*b1cdbd2cSJim Jagielski 		else
468*b1cdbd2cSJim Jagielski 			// ansonsten den String zwischen den beiden ';' liefern
469*b1cdbd2cSJim Jagielski 			return sTempStrg.Copy( 0,nPos );
470*b1cdbd2cSJim Jagielski 	}
471*b1cdbd2cSJim Jagielski 	String aRetStr;
472*b1cdbd2cSJim Jagielski 	aRetStr.AssignAscii( EMPTYFORMATSTRING );
473*b1cdbd2cSJim Jagielski 	return aRetStr;
474*b1cdbd2cSJim Jagielski }
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski // siehe auch GetPosFormatString()
Get0FormatString(const String & sFormatStrg,sal_Bool & bFound)477*b1cdbd2cSJim Jagielski String SbxBasicFormater::Get0FormatString( const String& sFormatStrg, sal_Bool & bFound )
478*b1cdbd2cSJim Jagielski {
479*b1cdbd2cSJim Jagielski 	bFound = sal_False;		// default...
480*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = sFormatStrg.Search( FORMAT_SEPARATOR );
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 	if( nPos!=STRING_NOTFOUND )
483*b1cdbd2cSJim Jagielski 	{
484*b1cdbd2cSJim Jagielski 		// der Format-String f"ur die Null ist alles
485*b1cdbd2cSJim Jagielski 		// was nach dem zweiten ';' kommt.
486*b1cdbd2cSJim Jagielski 		// Daher: hole erst mal alles nach dem ersten ';'
487*b1cdbd2cSJim Jagielski 		String sTempStrg = sFormatStrg.Copy( nPos+1 );
488*b1cdbd2cSJim Jagielski 		// und suche darin ggf. ein weiteres ';'
489*b1cdbd2cSJim Jagielski 		nPos = sTempStrg.Search( FORMAT_SEPARATOR );
490*b1cdbd2cSJim Jagielski 		if( nPos!=STRING_NOTFOUND )
491*b1cdbd2cSJim Jagielski 		{
492*b1cdbd2cSJim Jagielski 			bFound = sal_True;
493*b1cdbd2cSJim Jagielski 			sTempStrg = sTempStrg.Copy( nPos+1 );
494*b1cdbd2cSJim Jagielski 			nPos = sTempStrg.Search( FORMAT_SEPARATOR );
495*b1cdbd2cSJim Jagielski 			if( nPos==STRING_NOTFOUND )
496*b1cdbd2cSJim Jagielski 				// keins gefunden, liefere alles...
497*b1cdbd2cSJim Jagielski 				return sTempStrg;
498*b1cdbd2cSJim Jagielski 			else
499*b1cdbd2cSJim Jagielski 				return sTempStrg.Copy( 0,nPos );
500*b1cdbd2cSJim Jagielski 		}
501*b1cdbd2cSJim Jagielski 	}
502*b1cdbd2cSJim Jagielski 	// kein ; gefunden, liefere Leerstring
503*b1cdbd2cSJim Jagielski 	String aRetStr;
504*b1cdbd2cSJim Jagielski 	aRetStr.AssignAscii( EMPTYFORMATSTRING );
505*b1cdbd2cSJim Jagielski 	return aRetStr;
506*b1cdbd2cSJim Jagielski }
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski // siehe auch GetPosFormatString()
GetNullFormatString(const String & sFormatStrg,sal_Bool & bFound)509*b1cdbd2cSJim Jagielski String SbxBasicFormater::GetNullFormatString( const String& sFormatStrg, sal_Bool & bFound )
510*b1cdbd2cSJim Jagielski {
511*b1cdbd2cSJim Jagielski 	bFound = sal_False;		// default...
512*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = sFormatStrg.Search( FORMAT_SEPARATOR );
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 	if( nPos!=STRING_NOTFOUND )
515*b1cdbd2cSJim Jagielski 	{
516*b1cdbd2cSJim Jagielski 		// der Format-String f"ur die Null ist alles
517*b1cdbd2cSJim Jagielski 		// was nach dem dritten ';' kommt.
518*b1cdbd2cSJim Jagielski 		// Daher: hole erst mal alles nach dem ersten ';'
519*b1cdbd2cSJim Jagielski 		String sTempStrg = sFormatStrg.Copy( nPos+1 );
520*b1cdbd2cSJim Jagielski 		// und suche darin ggf. ein weiteres ';'
521*b1cdbd2cSJim Jagielski 		nPos = sTempStrg.Search( FORMAT_SEPARATOR );
522*b1cdbd2cSJim Jagielski 		if( nPos!=STRING_NOTFOUND )
523*b1cdbd2cSJim Jagielski 		{
524*b1cdbd2cSJim Jagielski 			// und suche nun nach dem dritten ';'
525*b1cdbd2cSJim Jagielski 			sTempStrg = sTempStrg.Copy( nPos+1 );
526*b1cdbd2cSJim Jagielski 			nPos = sTempStrg.Search( FORMAT_SEPARATOR );
527*b1cdbd2cSJim Jagielski 			if( nPos!=STRING_NOTFOUND )
528*b1cdbd2cSJim Jagielski 			{
529*b1cdbd2cSJim Jagielski 				bFound = sal_True;
530*b1cdbd2cSJim Jagielski 				return sTempStrg.Copy( nPos+1 );
531*b1cdbd2cSJim Jagielski 			}
532*b1cdbd2cSJim Jagielski 		}
533*b1cdbd2cSJim Jagielski 	}
534*b1cdbd2cSJim Jagielski 	// kein ; gefunden, liefere Leerstring
535*b1cdbd2cSJim Jagielski 	String aRetStr;
536*b1cdbd2cSJim Jagielski 	aRetStr.AssignAscii( EMPTYFORMATSTRING );
537*b1cdbd2cSJim Jagielski 	return aRetStr;
538*b1cdbd2cSJim Jagielski }
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski // analysiert den Format-String, liefert Wert <> 0 falls ein Fehler
541*b1cdbd2cSJim Jagielski // aufgetreten ist
AnalyseFormatString(const String & sFormatStrg,short & nNoOfDigitsLeft,short & nNoOfDigitsRight,short & nNoOfOptionalDigitsLeft,short & nNoOfExponentDigits,short & nNoOfOptionalExponentDigits,sal_Bool & bPercent,sal_Bool & bCurrency,sal_Bool & bScientific,sal_Bool & bGenerateThousandSeparator,short & nMultipleThousandSeparators)542*b1cdbd2cSJim Jagielski short SbxBasicFormater::AnalyseFormatString( const String& sFormatStrg,
543*b1cdbd2cSJim Jagielski 				short& nNoOfDigitsLeft, short& nNoOfDigitsRight,
544*b1cdbd2cSJim Jagielski 				short& nNoOfOptionalDigitsLeft,
545*b1cdbd2cSJim Jagielski 				short& nNoOfExponentDigits, short& nNoOfOptionalExponentDigits,
546*b1cdbd2cSJim Jagielski 				sal_Bool& bPercent, sal_Bool& bCurrency, sal_Bool& bScientific,
547*b1cdbd2cSJim Jagielski 				sal_Bool& bGenerateThousandSeparator,
548*b1cdbd2cSJim Jagielski 				short& nMultipleThousandSeparators )
549*b1cdbd2cSJim Jagielski {
550*b1cdbd2cSJim Jagielski 	sal_uInt16 nLen;
551*b1cdbd2cSJim Jagielski 	short nState = 0;
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski 	nLen = sFormatStrg.Len();
554*b1cdbd2cSJim Jagielski 	// initialisiere alle Z"ahler und Flags
555*b1cdbd2cSJim Jagielski 	nNoOfDigitsLeft = 0;
556*b1cdbd2cSJim Jagielski 	nNoOfDigitsRight = 0;
557*b1cdbd2cSJim Jagielski 	nNoOfOptionalDigitsLeft = 0;
558*b1cdbd2cSJim Jagielski 	nNoOfExponentDigits = 0;
559*b1cdbd2cSJim Jagielski 	nNoOfOptionalExponentDigits = 0;
560*b1cdbd2cSJim Jagielski 	bPercent = sal_False;
561*b1cdbd2cSJim Jagielski 	bCurrency = sal_False;
562*b1cdbd2cSJim Jagielski 	bScientific = sal_False;
563*b1cdbd2cSJim Jagielski 	// ab 11.7.97: sobald ein Komma in dem Format String gefunden wird,
564*b1cdbd2cSJim Jagielski 	// werden alle 3 Zehnerpotenzen markiert (d.h. tausender, milionen, ...)
565*b1cdbd2cSJim Jagielski 	// bisher wurde nur an den gesetzten Position ein Tausender-Separator
566*b1cdbd2cSJim Jagielski 	// ausgegeben oder wenn ein @ im Format-String stand.
567*b1cdbd2cSJim Jagielski 	// Dies war ein Missverstaendnis der VB Kompatiblitaet.
568*b1cdbd2cSJim Jagielski 	bGenerateThousandSeparator = sFormatStrg.Search( ',' ) != STRING_NOTFOUND;
569*b1cdbd2cSJim Jagielski 	nMultipleThousandSeparators = 0;
570*b1cdbd2cSJim Jagielski 	// und untersuche den Format-String nach den gew"unschten Informationen
571*b1cdbd2cSJim Jagielski 	for( sal_uInt16 i=0; i<nLen; i++ )
572*b1cdbd2cSJim Jagielski 	{
573*b1cdbd2cSJim Jagielski 		sal_Unicode c = sFormatStrg.GetChar( i );
574*b1cdbd2cSJim Jagielski 		switch( c ) {
575*b1cdbd2cSJim Jagielski 			case '#':
576*b1cdbd2cSJim Jagielski 			case '0':
577*b1cdbd2cSJim Jagielski 				if( nState==0 )
578*b1cdbd2cSJim Jagielski 				{
579*b1cdbd2cSJim Jagielski 					nNoOfDigitsLeft++;
580*b1cdbd2cSJim Jagielski // TODO  hier ggf. bessere Fehler-"Uberpr"ufung der Mantisse auf g"ultige Syntax (siehe Grammatik)
581*b1cdbd2cSJim Jagielski 					// ACHTUNG: 'undefiniertes' Verhalten falls # und 0
582*b1cdbd2cSJim Jagielski 					//	 gemischt werden !!!
583*b1cdbd2cSJim Jagielski 					// BEMERKUNG: eigentlich sind #-Platzhalter bei Scientific
584*b1cdbd2cSJim Jagielski 					//   Darstellung vor dem Dezimal-Punkt sinnlos !
585*b1cdbd2cSJim Jagielski 					if( c=='#' )
586*b1cdbd2cSJim Jagielski 						nNoOfOptionalDigitsLeft++;
587*b1cdbd2cSJim Jagielski 				}
588*b1cdbd2cSJim Jagielski 				else if( nState==1 )
589*b1cdbd2cSJim Jagielski 					nNoOfDigitsRight++;
590*b1cdbd2cSJim Jagielski 				else if( nState==-1 )	// suche 0 im Exponent
591*b1cdbd2cSJim Jagielski 				{
592*b1cdbd2cSJim Jagielski 					if( c=='#' )	// # schaltet den Zustand weiter
593*b1cdbd2cSJim Jagielski 					{
594*b1cdbd2cSJim Jagielski 						nNoOfOptionalExponentDigits++;
595*b1cdbd2cSJim Jagielski 						nState = -2;
596*b1cdbd2cSJim Jagielski 					}
597*b1cdbd2cSJim Jagielski 					nNoOfExponentDigits++;
598*b1cdbd2cSJim Jagielski 				}
599*b1cdbd2cSJim Jagielski 				else if( nState==-2 )	// suche # im Exponent
600*b1cdbd2cSJim Jagielski 				{
601*b1cdbd2cSJim Jagielski 					if( c=='0' )
602*b1cdbd2cSJim Jagielski 						// ERROR: 0 nach # im Exponent ist NICHT erlaubt !!
603*b1cdbd2cSJim Jagielski 						return -4;
604*b1cdbd2cSJim Jagielski 					nNoOfOptionalExponentDigits++;
605*b1cdbd2cSJim Jagielski 					nNoOfExponentDigits++;
606*b1cdbd2cSJim Jagielski 				}
607*b1cdbd2cSJim Jagielski 				break;
608*b1cdbd2cSJim Jagielski 			case '.':
609*b1cdbd2cSJim Jagielski 				nState++;
610*b1cdbd2cSJim Jagielski 				if( nState>1 )
611*b1cdbd2cSJim Jagielski 					return -1;	// ERROR: zu viele Dezimal-Punkte
612*b1cdbd2cSJim Jagielski 				break;
613*b1cdbd2cSJim Jagielski 			case '%':
614*b1cdbd2cSJim Jagielski 				bPercent = sal_True;
615*b1cdbd2cSJim Jagielski 				/* old:
616*b1cdbd2cSJim Jagielski 				bPercent++;
617*b1cdbd2cSJim Jagielski 				if( bPercent>1 )
618*b1cdbd2cSJim Jagielski 					return -2;	// ERROR: zu viele Prozent-Zeichen
619*b1cdbd2cSJim Jagielski 				*/
620*b1cdbd2cSJim Jagielski 				break;
621*b1cdbd2cSJim Jagielski 			case '(':
622*b1cdbd2cSJim Jagielski 				bCurrency = sal_True;
623*b1cdbd2cSJim Jagielski 				break;
624*b1cdbd2cSJim Jagielski 			case ',':
625*b1cdbd2cSJim Jagielski 			{
626*b1cdbd2cSJim Jagielski 				sal_Unicode ch = sFormatStrg.GetChar( i+1 );
627*b1cdbd2cSJim Jagielski 				// vorl"aufig wird NUR auf zwei aufeinanderfolgede
628*b1cdbd2cSJim Jagielski 				// Zeichen gepr"uft
629*b1cdbd2cSJim Jagielski 				if( ch!=0 && (ch==',' || ch=='.') )
630*b1cdbd2cSJim Jagielski 					nMultipleThousandSeparators++;
631*b1cdbd2cSJim Jagielski 			}	break;
632*b1cdbd2cSJim Jagielski 			case 'e':
633*b1cdbd2cSJim Jagielski 			case 'E':
634*b1cdbd2cSJim Jagielski 				// #i13821 not when no digits before
635*b1cdbd2cSJim Jagielski 				if( nNoOfDigitsLeft > 0 || nNoOfDigitsRight > 0 )
636*b1cdbd2cSJim Jagielski 				{
637*b1cdbd2cSJim Jagielski  					nState = -1;	// breche jetzt das Z"ahlen der Stellen ab
638*b1cdbd2cSJim Jagielski 					bScientific = sal_True;
639*b1cdbd2cSJim Jagielski 				}
640*b1cdbd2cSJim Jagielski 				/* old:
641*b1cdbd2cSJim Jagielski 				bScientific++;
642*b1cdbd2cSJim Jagielski 				if( bScientific>1 )
643*b1cdbd2cSJim Jagielski 					return -3;	// ERROR: zu viele Exponent-Zeichen
644*b1cdbd2cSJim Jagielski 				*/
645*b1cdbd2cSJim Jagielski 				break;
646*b1cdbd2cSJim Jagielski 			// EIGENES Kommando-Zeichen, das die Erzeugung der
647*b1cdbd2cSJim Jagielski 			// Tausender-Trennzeichen einschaltet
648*b1cdbd2cSJim Jagielski 			case '\\':
649*b1cdbd2cSJim Jagielski 				// Ignore next char
650*b1cdbd2cSJim Jagielski 				i++;
651*b1cdbd2cSJim Jagielski 				break;
652*b1cdbd2cSJim Jagielski 			case CREATE_1000SEP_CHAR:
653*b1cdbd2cSJim Jagielski 				bGenerateThousandSeparator = sal_True;
654*b1cdbd2cSJim Jagielski 				break;
655*b1cdbd2cSJim Jagielski 		}
656*b1cdbd2cSJim Jagielski 	}
657*b1cdbd2cSJim Jagielski 	return 0;
658*b1cdbd2cSJim Jagielski }
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski // das Flag bCreateSign zeigt an, dass bei der Mantisse ein Vorzeichen
661*b1cdbd2cSJim Jagielski // erzeugt werden soll
ScanFormatString(double dNumber,const String & sFormatStrg,String & sReturnStrg,sal_Bool bCreateSign)662*b1cdbd2cSJim Jagielski void SbxBasicFormater::ScanFormatString( double dNumber,
663*b1cdbd2cSJim Jagielski 								const String& sFormatStrg, String& sReturnStrg,
664*b1cdbd2cSJim Jagielski 								sal_Bool bCreateSign )
665*b1cdbd2cSJim Jagielski {
666*b1cdbd2cSJim Jagielski 	short 	/*nErr,*/nNoOfDigitsLeft,nNoOfDigitsRight,nNoOfOptionalDigitsLeft,
667*b1cdbd2cSJim Jagielski 			nNoOfExponentDigits,nNoOfOptionalExponentDigits,
668*b1cdbd2cSJim Jagielski 			nMultipleThousandSeparators;
669*b1cdbd2cSJim Jagielski 	sal_Bool 	bPercent,bCurrency,bScientific,bGenerateThousandSeparator;
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski 	// Initialisiere den Return-String
672*b1cdbd2cSJim Jagielski 	sReturnStrg = String();
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 	// analysiere den Format-String, d.h. bestimme folgende Werte:
675*b1cdbd2cSJim Jagielski 	/*
676*b1cdbd2cSJim Jagielski 			- Anzahl der Ziffern vor dem Komma
677*b1cdbd2cSJim Jagielski 			- Anzahl der Ziffern nach dem Komma
678*b1cdbd2cSJim Jagielski 			- optionale Ziffern vor dem Komma
679*b1cdbd2cSJim Jagielski 			- Anzahl der Ziffern im Exponent
680*b1cdbd2cSJim Jagielski 			- optionale Ziffern im Exponent
681*b1cdbd2cSJim Jagielski 			- Prozent-Zeichen gefunden ?
682*b1cdbd2cSJim Jagielski 			- () f"ur negatives Vorzeichen ?
683*b1cdbd2cSJim Jagielski 			- Exponetial-Schreibweise ?
684*b1cdbd2cSJim Jagielski 			- sollen Tausender-Separatoren erzeugt werden ?
685*b1cdbd2cSJim Jagielski 			- wird ein Prozent-Zeichen gefunden ? --> dNumber *= 100.0;
686*b1cdbd2cSJim Jagielski 			- gibt es aufeinanderfolgende Tausender-Trennzeichen ?
687*b1cdbd2cSJim Jagielski 				,, oder ,. --> dNumber /= 1000.0;
688*b1cdbd2cSJim Jagielski 			- sonstige Fehler ? mehrfache Dezimalpunkte, E's, etc.
689*b1cdbd2cSJim Jagielski 		--> Fehler werden zur Zeit einfach ignoriert
690*b1cdbd2cSJim Jagielski 	*/
691*b1cdbd2cSJim Jagielski 	/*nErr =*/ AnalyseFormatString( sFormatStrg,nNoOfDigitsLeft,nNoOfDigitsRight,
692*b1cdbd2cSJim Jagielski 					nNoOfOptionalDigitsLeft,nNoOfExponentDigits,
693*b1cdbd2cSJim Jagielski 					nNoOfOptionalExponentDigits,
694*b1cdbd2cSJim Jagielski 					bPercent,bCurrency,bScientific,bGenerateThousandSeparator,
695*b1cdbd2cSJim Jagielski 					nMultipleThousandSeparators );
696*b1cdbd2cSJim Jagielski 	/* es werden alle Fehler ignoriert, wie in Visual-Basic
697*b1cdbd2cSJim Jagielski 	if( nErr!=0 )
698*b1cdbd2cSJim Jagielski 	{
699*b1cdbd2cSJim Jagielski 		char sBuffer[512];
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski 		//sprintf( sBuffer,"bad format-string >%s< err=%i",sFormatStrg,nErr );
702*b1cdbd2cSJim Jagielski 		strcpy( sBuffer,"bad format-string" );
703*b1cdbd2cSJim Jagielski 		ShowError( sBuffer );
704*b1cdbd2cSJim Jagielski 	}
705*b1cdbd2cSJim Jagielski 	else
706*b1cdbd2cSJim Jagielski 	*/
707*b1cdbd2cSJim Jagielski 	{
708*b1cdbd2cSJim Jagielski 		// Spezialbehandlung f"ur Spezialzeichen
709*b1cdbd2cSJim Jagielski 		if( bPercent )
710*b1cdbd2cSJim Jagielski 			dNumber *= 100.0;
711*b1cdbd2cSJim Jagielski // TODO: diese Vorgabe (,, oder ,.) ist NICHT Visual-Basic kompatibel !
712*b1cdbd2cSJim Jagielski 		// Frage: soll das hier stehen bleiben (Anforderungen) ?
713*b1cdbd2cSJim Jagielski 		if( nMultipleThousandSeparators )
714*b1cdbd2cSJim Jagielski 			dNumber /= 1000.0;
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski 		// einige Arbeits-Variablen
717*b1cdbd2cSJim Jagielski 		double dExponent;
718*b1cdbd2cSJim Jagielski 		short i,nLen;
719*b1cdbd2cSJim Jagielski 		short nState,nDigitPos,nExponentPos,nMaxDigit,nMaxExponentDigit;
720*b1cdbd2cSJim Jagielski 		sal_Bool bFirstDigit,bFirstExponentDigit,bFoundFirstDigit,
721*b1cdbd2cSJim Jagielski 			 bIsNegative,bZeroSpaceOn, bSignHappend,bDigitPosNegative;
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 		// Initialisierung der Arbeits-Variablen
724*b1cdbd2cSJim Jagielski 		bSignHappend = sal_False;
725*b1cdbd2cSJim Jagielski 		bFoundFirstDigit = sal_False;
726*b1cdbd2cSJim Jagielski 		bIsNegative = dNumber<0.0;
727*b1cdbd2cSJim Jagielski 		nLen = sFormatStrg.Len();
728*b1cdbd2cSJim Jagielski 		dExponent = get_number_of_digits( dNumber );
729*b1cdbd2cSJim Jagielski 		nExponentPos = 0;
730*b1cdbd2cSJim Jagielski 		nMaxExponentDigit = 0;
731*b1cdbd2cSJim Jagielski 		nMaxDigit = (short)dExponent;
732*b1cdbd2cSJim Jagielski 		bDigitPosNegative = false;
733*b1cdbd2cSJim Jagielski 		if( bScientific )
734*b1cdbd2cSJim Jagielski 		{
735*b1cdbd2cSJim Jagielski 			//if( nNoOfOptionalDigitsLeft>0 )
736*b1cdbd2cSJim Jagielski 			//	ShowError( "# in scientific-format in front of the decimal-point has no effect" );
737*b1cdbd2cSJim Jagielski 			// beim Exponent ggf. "uberz"ahlige Stellen vor dem Komma abziehen
738*b1cdbd2cSJim Jagielski 			dExponent = dExponent - (double)(nNoOfDigitsLeft-1);
739*b1cdbd2cSJim Jagielski 			nDigitPos = nMaxDigit;
740*b1cdbd2cSJim Jagielski 			nMaxExponentDigit = (short)get_number_of_digits( dExponent );
741*b1cdbd2cSJim Jagielski 			nExponentPos = nNoOfExponentDigits-1 - nNoOfOptionalExponentDigits;
742*b1cdbd2cSJim Jagielski 		}
743*b1cdbd2cSJim Jagielski 		else
744*b1cdbd2cSJim Jagielski 		{
745*b1cdbd2cSJim Jagielski 			nDigitPos = nNoOfDigitsLeft-1; // Z"ahlweise f"angt bei 0 an, 10^0
746*b1cdbd2cSJim Jagielski 			// hier ben"otigt man keine Exponent-Daten !
747*b1cdbd2cSJim Jagielski 			bDigitPosNegative = (nDigitPos < 0);
748*b1cdbd2cSJim Jagielski 		}
749*b1cdbd2cSJim Jagielski 		bFirstDigit = sal_True;
750*b1cdbd2cSJim Jagielski 		bFirstExponentDigit = sal_True;
751*b1cdbd2cSJim Jagielski 		nState = 0; // 0 --> Mantisse; 1 --> Exponent
752*b1cdbd2cSJim Jagielski 		bZeroSpaceOn = 0;
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski #ifdef _with_sprintf
756*b1cdbd2cSJim Jagielski 		InitScan( dNumber );
757*b1cdbd2cSJim Jagielski #endif
758*b1cdbd2cSJim Jagielski 		// scanne jetzt den Format-String:
759*b1cdbd2cSJim Jagielski 		sal_Unicode cForce = 0;
760*b1cdbd2cSJim Jagielski 		for( i=0; i<nLen; i++ )
761*b1cdbd2cSJim Jagielski 		{
762*b1cdbd2cSJim Jagielski 			sal_Unicode c;
763*b1cdbd2cSJim Jagielski 			if( cForce )
764*b1cdbd2cSJim Jagielski 			{
765*b1cdbd2cSJim Jagielski 				c = cForce;
766*b1cdbd2cSJim Jagielski 				cForce = 0;
767*b1cdbd2cSJim Jagielski 			}
768*b1cdbd2cSJim Jagielski 			else
769*b1cdbd2cSJim Jagielski 			{
770*b1cdbd2cSJim Jagielski 				c = sFormatStrg.GetChar( i );
771*b1cdbd2cSJim Jagielski 			}
772*b1cdbd2cSJim Jagielski 			switch( c ) {
773*b1cdbd2cSJim Jagielski 				case '0':
774*b1cdbd2cSJim Jagielski 				case '#':
775*b1cdbd2cSJim Jagielski 					if( nState==0 )
776*b1cdbd2cSJim Jagielski 					{
777*b1cdbd2cSJim Jagielski 					// Behandlung der Mantisse
778*b1cdbd2cSJim Jagielski 						if( bFirstDigit )
779*b1cdbd2cSJim Jagielski 						{
780*b1cdbd2cSJim Jagielski 							//org:bFirstDigit = sal_False;
781*b1cdbd2cSJim Jagielski 							// ggf. Vorzeichen erzeugen
782*b1cdbd2cSJim Jagielski 							// Bem.: bei bCurrency soll das negative
783*b1cdbd2cSJim Jagielski 							//       Vorzeichen durch () angezeigt werden
784*b1cdbd2cSJim Jagielski 							if( bIsNegative && !bCreateSign/*!bCurrency*/ && !bSignHappend )
785*b1cdbd2cSJim Jagielski 							{
786*b1cdbd2cSJim Jagielski 								// nur einmal ein Vorzeichen ausgeben
787*b1cdbd2cSJim Jagielski 								bSignHappend = sal_True;
788*b1cdbd2cSJim Jagielski 								StrAppendChar( sReturnStrg,'-' );
789*b1cdbd2cSJim Jagielski 							}
790*b1cdbd2cSJim Jagielski 							// hier jetzt "uberz"ahlige Stellen ausgeben,
791*b1cdbd2cSJim Jagielski 							// d.h. vom Format-String nicht erfasste Stellen
792*b1cdbd2cSJim Jagielski 							if( nMaxDigit>nDigitPos )
793*b1cdbd2cSJim Jagielski 							{
794*b1cdbd2cSJim Jagielski 								for( short j=nMaxDigit; j>nDigitPos; j-- )
795*b1cdbd2cSJim Jagielski 								{
796*b1cdbd2cSJim Jagielski 									short nTempDigit;
797*b1cdbd2cSJim Jagielski #ifdef _with_sprintf
798*b1cdbd2cSJim Jagielski 									AppendDigit( sReturnStrg,nTempDigit = GetDigitAtPosScan( j,bFoundFirstDigit ) );
799*b1cdbd2cSJim Jagielski #else
800*b1cdbd2cSJim Jagielski 									AppendDigit( sReturnStrg,nTempDigit = GetDigitAtPos( dNumber,j,dNumber,bFoundFirstDigit ) );
801*b1cdbd2cSJim Jagielski #endif
802*b1cdbd2cSJim Jagielski 									// wurde wirklich eine Ziffer eingefuegt ?
803*b1cdbd2cSJim Jagielski 									if( nTempDigit!=_NO_DIGIT )
804*b1cdbd2cSJim Jagielski 										// jetzt wurde wirklich eine Ziffer ausgegeben, Flag setzen
805*b1cdbd2cSJim Jagielski 										bFirstDigit = sal_False;
806*b1cdbd2cSJim Jagielski 									// muss ggf. ein Tausender-Trennzeichen erzeugt werden?
807*b1cdbd2cSJim Jagielski 									if( bGenerateThousandSeparator && ( c=='0' || nMaxDigit>=nDigitPos ) && j>0 && (j % 3 == 0) )
808*b1cdbd2cSJim Jagielski 										StrAppendChar( sReturnStrg,cThousandSep );
809*b1cdbd2cSJim Jagielski 								}
810*b1cdbd2cSJim Jagielski 							}
811*b1cdbd2cSJim Jagielski 						}
812*b1cdbd2cSJim Jagielski 						// muss f"ur eine leere Stelle eventuell eine 0 ausgegeben werden ?
813*b1cdbd2cSJim Jagielski 						if( nMaxDigit<nDigitPos && ( c=='0' || bZeroSpaceOn ) )
814*b1cdbd2cSJim Jagielski 						{
815*b1cdbd2cSJim Jagielski 							AppendDigit( sReturnStrg,0 );		// Ja
816*b1cdbd2cSJim Jagielski 							// jetzt wurde wirklich eine Ziffer ausgegeben, Flag setzen
817*b1cdbd2cSJim Jagielski 							bFirstDigit = sal_False;
818*b1cdbd2cSJim Jagielski 							bZeroSpaceOn = 1;
819*b1cdbd2cSJim Jagielski 							// BEM.: bei Visual-Basic schaltet die erste 0 f"ur alle
820*b1cdbd2cSJim Jagielski 							//       nachfolgenden # (bis zum Dezimal-Punkt) die 0 ein,
821*b1cdbd2cSJim Jagielski 							//		 dieses Verhalten wird hier mit dem Flag simmuliert.
822*b1cdbd2cSJim Jagielski 							// muss ggf. ein Tausender-Trennzeichen erzeugt werden?
823*b1cdbd2cSJim Jagielski 							if( bGenerateThousandSeparator && ( c=='0' || nMaxDigit>=nDigitPos ) && nDigitPos>0 && (nDigitPos % 3 == 0) )
824*b1cdbd2cSJim Jagielski 								StrAppendChar( sReturnStrg,cThousandSep );
825*b1cdbd2cSJim Jagielski 						}
826*b1cdbd2cSJim Jagielski 						else
827*b1cdbd2cSJim Jagielski 						{
828*b1cdbd2cSJim Jagielski 							short nTempDigit;
829*b1cdbd2cSJim Jagielski #ifdef _with_sprintf
830*b1cdbd2cSJim Jagielski 							AppendDigit( sReturnStrg,nTempDigit = GetDigitAtPosScan( nDigitPos,bFoundFirstDigit ) );
831*b1cdbd2cSJim Jagielski #else
832*b1cdbd2cSJim Jagielski 							AppendDigit( sReturnStrg,nTempDigit = GetDigitAtPos( dNumber,nDigitPos,dNumber,bFoundFirstDigit ) );
833*b1cdbd2cSJim Jagielski #endif
834*b1cdbd2cSJim Jagielski 							// wurde wirklich eine Ziffer eingefuegt ?
835*b1cdbd2cSJim Jagielski 							if( nTempDigit!=_NO_DIGIT )
836*b1cdbd2cSJim Jagielski 								// jetzt wurde wirklich eine Ziffer ausgegeben, Flag setzen
837*b1cdbd2cSJim Jagielski 								bFirstDigit = sal_False;
838*b1cdbd2cSJim Jagielski 							// muss ggf. ein Tausender-Trennzeichen erzeugt werden?
839*b1cdbd2cSJim Jagielski 							if( bGenerateThousandSeparator && ( c=='0' || nMaxDigit>=nDigitPos ) && nDigitPos>0 && (nDigitPos % 3 == 0) )
840*b1cdbd2cSJim Jagielski 								StrAppendChar( sReturnStrg,cThousandSep );
841*b1cdbd2cSJim Jagielski 						}
842*b1cdbd2cSJim Jagielski 						// und Position aktualisieren
843*b1cdbd2cSJim Jagielski 						nDigitPos--;
844*b1cdbd2cSJim Jagielski 					}
845*b1cdbd2cSJim Jagielski 					else
846*b1cdbd2cSJim Jagielski 					{
847*b1cdbd2cSJim Jagielski 					// Behandlung des Exponenten
848*b1cdbd2cSJim Jagielski 						if( bFirstExponentDigit )
849*b1cdbd2cSJim Jagielski 						{
850*b1cdbd2cSJim Jagielski 							// Vorzeichen wurde schon bei e/E ausgegeben
851*b1cdbd2cSJim Jagielski 							bFirstExponentDigit = sal_False;
852*b1cdbd2cSJim Jagielski 							if( nMaxExponentDigit>nExponentPos )
853*b1cdbd2cSJim Jagielski 							// hier jetzt "uberz"ahlige Stellen ausgeben,
854*b1cdbd2cSJim Jagielski 							// d.h. vom Format-String nicht erfasste Stellen
855*b1cdbd2cSJim Jagielski 							{
856*b1cdbd2cSJim Jagielski 								for( short j=nMaxExponentDigit; j>nExponentPos; j-- )
857*b1cdbd2cSJim Jagielski 								{
858*b1cdbd2cSJim Jagielski #ifdef _with_sprintf
859*b1cdbd2cSJim Jagielski 									AppendDigit( sReturnStrg,GetDigitAtPosExpScan( dExponent,j,bFoundFirstDigit ) );
860*b1cdbd2cSJim Jagielski #else
861*b1cdbd2cSJim Jagielski 									AppendDigit( sReturnStrg,GetDigitAtPos( dExponent,j,dExponent,bFoundFirstDigit ) );
862*b1cdbd2cSJim Jagielski #endif
863*b1cdbd2cSJim Jagielski 								}
864*b1cdbd2cSJim Jagielski 							}
865*b1cdbd2cSJim Jagielski 						}
866*b1cdbd2cSJim Jagielski 						// muss f"ur eine leere Stelle eventuell eine 0 ausgegeben werden ?
867*b1cdbd2cSJim Jagielski 						if( nMaxExponentDigit<nExponentPos && c=='0' )
868*b1cdbd2cSJim Jagielski 							AppendDigit( sReturnStrg,0 );		// Ja
869*b1cdbd2cSJim Jagielski 						else
870*b1cdbd2cSJim Jagielski #ifdef _with_sprintf
871*b1cdbd2cSJim Jagielski 							AppendDigit( sReturnStrg,GetDigitAtPosExpScan( dExponent,nExponentPos,bFoundFirstDigit ) );
872*b1cdbd2cSJim Jagielski #else
873*b1cdbd2cSJim Jagielski 							AppendDigit( sReturnStrg,GetDigitAtPos( dExponent,nExponentPos,dExponent,bFoundFirstDigit ) );
874*b1cdbd2cSJim Jagielski #endif
875*b1cdbd2cSJim Jagielski 						nExponentPos--;
876*b1cdbd2cSJim Jagielski 					}
877*b1cdbd2cSJim Jagielski 					break;
878*b1cdbd2cSJim Jagielski 				case '.':
879*b1cdbd2cSJim Jagielski 					if( bDigitPosNegative )	// #i13821: If no digits before .
880*b1cdbd2cSJim Jagielski 					{
881*b1cdbd2cSJim Jagielski 						bDigitPosNegative = false;
882*b1cdbd2cSJim Jagielski 						nDigitPos = 0;
883*b1cdbd2cSJim Jagielski 						cForce = '#';
884*b1cdbd2cSJim Jagielski 						i-=2;
885*b1cdbd2cSJim Jagielski 						break;
886*b1cdbd2cSJim Jagielski 					}
887*b1cdbd2cSJim Jagielski 					// gebe Komma aus
888*b1cdbd2cSJim Jagielski 					StrAppendChar( sReturnStrg,cDecPoint );
889*b1cdbd2cSJim Jagielski 					break;
890*b1cdbd2cSJim Jagielski 				case '%':
891*b1cdbd2cSJim Jagielski 					// ggf. "uberf"ussige 0en l"oschen, z.B. 4.500e4 in 0.0##e-00
892*b1cdbd2cSJim Jagielski 					ParseBack( sReturnStrg,sFormatStrg,i-1 );
893*b1cdbd2cSJim Jagielski 					// gebe Prozent-Zeichen aus
894*b1cdbd2cSJim Jagielski 					sReturnStrg.Insert('%');
895*b1cdbd2cSJim Jagielski 					break;
896*b1cdbd2cSJim Jagielski 				case 'e':
897*b1cdbd2cSJim Jagielski 				case 'E':
898*b1cdbd2cSJim Jagielski 					// muss Mantisse noch gerundet werden, bevor der Exponent angezeigt wird ?
899*b1cdbd2cSJim Jagielski 					{
900*b1cdbd2cSJim Jagielski 						// gibt es ueberhaupt eine Mantisse ?
901*b1cdbd2cSJim Jagielski 						if( bFirstDigit )
902*b1cdbd2cSJim Jagielski 						{
903*b1cdbd2cSJim Jagielski 							// anscheinend nicht, d.h. ungueltiger Format String, z.B. E000.00
904*b1cdbd2cSJim Jagielski 							// d.h. ignoriere diese e bzw. E Zeichen
905*b1cdbd2cSJim Jagielski 							// ggf. einen Fehler (wie Visual Basic) ausgeben ?
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski 							// #i13821: VB 6 behaviour
908*b1cdbd2cSJim Jagielski 							StrAppendChar( sReturnStrg,c );
909*b1cdbd2cSJim Jagielski 							break;
910*b1cdbd2cSJim Jagielski 						}
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski 						sal_Bool bOverflow = sal_False;
913*b1cdbd2cSJim Jagielski #ifdef _with_sprintf
914*b1cdbd2cSJim Jagielski 						short nNextDigit = GetDigitAtPosScan( nDigitPos,bFoundFirstDigit );
915*b1cdbd2cSJim Jagielski #else
916*b1cdbd2cSJim Jagielski 						short nNextDigit = GetDigitAtPos( dNumber,nDigitPos,dNumber,bFoundFirstDigit );
917*b1cdbd2cSJim Jagielski #endif
918*b1cdbd2cSJim Jagielski 						if( nNextDigit>=5 )
919*b1cdbd2cSJim Jagielski 							StrRoundDigit( sReturnStrg,sReturnStrg.Len()-1,bOverflow );
920*b1cdbd2cSJim Jagielski 						if( bOverflow )
921*b1cdbd2cSJim Jagielski 						{
922*b1cdbd2cSJim Jagielski 							// es wurde eine f"uhrende 9 gerundet, d.h.
923*b1cdbd2cSJim Jagielski 							// verschiebe den Dezimal-Punkt um eine Stelle nach links
924*b1cdbd2cSJim Jagielski 							LeftShiftDecimalPoint( sReturnStrg );
925*b1cdbd2cSJim Jagielski 							// und l"osche die letzte Ziffer, diese wird
926*b1cdbd2cSJim Jagielski 							// duch die f"uhrende 1 ersetzt:
927*b1cdbd2cSJim Jagielski 							sReturnStrg.SetChar( sReturnStrg.Len()-1 , 0 );
928*b1cdbd2cSJim Jagielski 							// der Exponent muss um 1 erh"oht werden,
929*b1cdbd2cSJim Jagielski 							// da der Dezimalpunkt verschoben wurde
930*b1cdbd2cSJim Jagielski 							dExponent += 1.0;
931*b1cdbd2cSJim Jagielski 						}
932*b1cdbd2cSJim Jagielski 						// ggf. "uberf"ussige 0en l"oschen, z.B. 4.500e4 in 0.0##e-00
933*b1cdbd2cSJim Jagielski 						ParseBack( sReturnStrg,sFormatStrg,i-1 );
934*b1cdbd2cSJim Jagielski 					}
935*b1cdbd2cSJim Jagielski 					// "andere Zustand des Scanners
936*b1cdbd2cSJim Jagielski 					nState++;
937*b1cdbd2cSJim Jagielski 					// gebe Exponent-Zeichen aus
938*b1cdbd2cSJim Jagielski 					StrAppendChar( sReturnStrg,c );
939*b1cdbd2cSJim Jagielski 					// i++;	// MANIPULATION der Schleifen-Variable !
940*b1cdbd2cSJim Jagielski 					c = sFormatStrg.GetChar( ++i );
941*b1cdbd2cSJim Jagielski 					// und gebe Vorzeichen / Exponent aus
942*b1cdbd2cSJim Jagielski 					if( c!=0 )
943*b1cdbd2cSJim Jagielski 					{
944*b1cdbd2cSJim Jagielski 						if( c=='-' )
945*b1cdbd2cSJim Jagielski 						{
946*b1cdbd2cSJim Jagielski 							// falls Exponent < 0 gebe - aus
947*b1cdbd2cSJim Jagielski 							if( dExponent<0.0 )
948*b1cdbd2cSJim Jagielski 								StrAppendChar( sReturnStrg,'-' );
949*b1cdbd2cSJim Jagielski 						}
950*b1cdbd2cSJim Jagielski 						else if( c=='+' )
951*b1cdbd2cSJim Jagielski 						{
952*b1cdbd2cSJim Jagielski 							// gebe auf jeden Fall das Vorzeichen des Exponenten aus !
953*b1cdbd2cSJim Jagielski 							if( dExponent<0.0 )
954*b1cdbd2cSJim Jagielski 								StrAppendChar( sReturnStrg,'-' );
955*b1cdbd2cSJim Jagielski 							else
956*b1cdbd2cSJim Jagielski 								StrAppendChar( sReturnStrg,'+' );
957*b1cdbd2cSJim Jagielski 						}
958*b1cdbd2cSJim Jagielski 						//else
959*b1cdbd2cSJim Jagielski 						//	ShowError( "operator e/E did not find + or -" );
960*b1cdbd2cSJim Jagielski 					}
961*b1cdbd2cSJim Jagielski 					//else
962*b1cdbd2cSJim Jagielski 					//	ShowError( "operator e/E ended with 0" );
963*b1cdbd2cSJim Jagielski 					break;
964*b1cdbd2cSJim Jagielski 				case ',':
965*b1cdbd2cSJim Jagielski 					// ACHTUNG: nur falls Zahl bisher ausgegeben wurde
966*b1cdbd2cSJim Jagielski 					//			das Zeichen ausgeben
967*b1cdbd2cSJim Jagielski 					////--> Siehe Kommentar vom 11.7. in AnalyseFormatString()
968*b1cdbd2cSJim Jagielski 					////if( !bFirstDigit )
969*b1cdbd2cSJim Jagielski 					////	// gebe Tausender-Trennzeichen aus
970*b1cdbd2cSJim Jagielski 					////	StrAppendChar( sReturnStrg,cThousandSep );
971*b1cdbd2cSJim Jagielski 					break;
972*b1cdbd2cSJim Jagielski 				case ';':
973*b1cdbd2cSJim Jagielski 					break;
974*b1cdbd2cSJim Jagielski 				case '(':
975*b1cdbd2cSJim Jagielski 				case ')':
976*b1cdbd2cSJim Jagielski 					// ggf. "uberf"ussige 0en l"oschen, z.B. 4.500e4 in 0.0##e-00
977*b1cdbd2cSJim Jagielski 					ParseBack( sReturnStrg,sFormatStrg,i-1 );
978*b1cdbd2cSJim Jagielski 					if( bIsNegative )
979*b1cdbd2cSJim Jagielski 						StrAppendChar( sReturnStrg,c );
980*b1cdbd2cSJim Jagielski 					break;
981*b1cdbd2cSJim Jagielski 				case '$':
982*b1cdbd2cSJim Jagielski 					// den String fuer die Waehrung dranhengen:
983*b1cdbd2cSJim Jagielski 					sReturnStrg += sCurrencyStrg;
984*b1cdbd2cSJim Jagielski 					break;
985*b1cdbd2cSJim Jagielski 				case ' ':
986*b1cdbd2cSJim Jagielski 				case '-':
987*b1cdbd2cSJim Jagielski 				case '+':
988*b1cdbd2cSJim Jagielski 					// ggf. "uberf"ussige 0en l"oschen, z.B. 4.500e4 in 0.0##e-00
989*b1cdbd2cSJim Jagielski 					ParseBack( sReturnStrg,sFormatStrg,i-1 );
990*b1cdbd2cSJim Jagielski 					// gebe das jeweilige Zeichen direkt aus
991*b1cdbd2cSJim Jagielski 					StrAppendChar( sReturnStrg,c );
992*b1cdbd2cSJim Jagielski 					break;
993*b1cdbd2cSJim Jagielski 				case '\\':
994*b1cdbd2cSJim Jagielski 					// ggf. "uberf"ussige 0en l"oschen, z.B. 4.500e4 in 0.0##e-00
995*b1cdbd2cSJim Jagielski 					// falls Sonderzeichen am Ende oder mitten in
996*b1cdbd2cSJim Jagielski 					// Format-String vorkommen
997*b1cdbd2cSJim Jagielski 					ParseBack( sReturnStrg,sFormatStrg,i-1 );
998*b1cdbd2cSJim Jagielski 					// Sonderzeichen gefunden, gebe N"ACHSTES
999*b1cdbd2cSJim Jagielski 					// Zeichen direkt aus (falls es existiert)
1000*b1cdbd2cSJim Jagielski 					// i++;
1001*b1cdbd2cSJim Jagielski 					c = sFormatStrg.GetChar( ++i );
1002*b1cdbd2cSJim Jagielski 					if( c!=0 )
1003*b1cdbd2cSJim Jagielski 						StrAppendChar( sReturnStrg,c );
1004*b1cdbd2cSJim Jagielski 					//else
1005*b1cdbd2cSJim Jagielski 					//	ShowError( "operator \\ ended with 0" );
1006*b1cdbd2cSJim Jagielski 					break;
1007*b1cdbd2cSJim Jagielski 				case CREATE_1000SEP_CHAR:
1008*b1cdbd2cSJim Jagielski 					// hier ignorieren, Aktion wurde schon in
1009*b1cdbd2cSJim Jagielski 					// AnalyseFormatString durchgef"uhrt
1010*b1cdbd2cSJim Jagielski 					break;
1011*b1cdbd2cSJim Jagielski 				default:
1012*b1cdbd2cSJim Jagielski 					// auch die Zeichen und Ziffern ausgeben (wie in Visual-Basic)
1013*b1cdbd2cSJim Jagielski 					if( ( c>='a' && c<='z' ) ||
1014*b1cdbd2cSJim Jagielski 						( c>='A' && c<='Z' ) ||
1015*b1cdbd2cSJim Jagielski 						( c>='1' && c<='9' ) )
1016*b1cdbd2cSJim Jagielski 						StrAppendChar( sReturnStrg,c );
1017*b1cdbd2cSJim Jagielski 					// else
1018*b1cdbd2cSJim Jagielski 						// ignorieren !
1019*b1cdbd2cSJim Jagielski 					// ehemals: ShowError( "bad character in format-string" );
1020*b1cdbd2cSJim Jagielski 			}
1021*b1cdbd2cSJim Jagielski 		}
1022*b1cdbd2cSJim Jagielski 		// Format-String wurde vollst"andig gescanned,
1023*b1cdbd2cSJim Jagielski 		// muss die letzte Stelle nun gerundet werden ?
1024*b1cdbd2cSJim Jagielski 		// Dies hier ist jedoch NUR notwendig, falls das
1025*b1cdbd2cSJim Jagielski 		// Zahlenformat NICHT Scientific-Format ist !
1026*b1cdbd2cSJim Jagielski 		if( !bScientific )
1027*b1cdbd2cSJim Jagielski 		{
1028*b1cdbd2cSJim Jagielski #ifdef _with_sprintf
1029*b1cdbd2cSJim Jagielski 			short nNextDigit = GetDigitAtPosScan( nDigitPos,bFoundFirstDigit );
1030*b1cdbd2cSJim Jagielski #else
1031*b1cdbd2cSJim Jagielski 			short nNextDigit = GetDigitAtPos( dNumber,nDigitPos,dNumber,bFoundFirstDigit );
1032*b1cdbd2cSJim Jagielski #endif
1033*b1cdbd2cSJim Jagielski 			if( nNextDigit>=5 )
1034*b1cdbd2cSJim Jagielski 				StrRoundDigit( sReturnStrg,sReturnStrg.Len()-1 );
1035*b1cdbd2cSJim Jagielski 		}
1036*b1cdbd2cSJim Jagielski 		// und ganz zum Schluss:
1037*b1cdbd2cSJim Jagielski 		// ggf. "uberf"ussige 0en l"oschen, z.B. 4.500e4 in 0.0##e-00#,
1038*b1cdbd2cSJim Jagielski 		// ABER nur Stellen nach dem Dezimal-Punkt k"onnen gel"oscht werden
1039*b1cdbd2cSJim Jagielski 		if( nNoOfDigitsRight>0 )
1040*b1cdbd2cSJim Jagielski 			ParseBack( sReturnStrg,sFormatStrg,sFormatStrg.Len()-1 );
1041*b1cdbd2cSJim Jagielski 	}
1042*b1cdbd2cSJim Jagielski }
1043*b1cdbd2cSJim Jagielski 
BasicFormatNull(String sFormatStrg)1044*b1cdbd2cSJim Jagielski String SbxBasicFormater::BasicFormatNull( String sFormatStrg )
1045*b1cdbd2cSJim Jagielski {
1046*b1cdbd2cSJim Jagielski 	sal_Bool bNullFormatFound;
1047*b1cdbd2cSJim Jagielski 	String sNullFormatStrg = GetNullFormatString( sFormatStrg,bNullFormatFound );
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski 	if( bNullFormatFound )
1050*b1cdbd2cSJim Jagielski 		return sNullFormatStrg;
1051*b1cdbd2cSJim Jagielski 	String aRetStr;
1052*b1cdbd2cSJim Jagielski 	aRetStr.AssignAscii( "null" );
1053*b1cdbd2cSJim Jagielski 	return aRetStr;
1054*b1cdbd2cSJim Jagielski }
1055*b1cdbd2cSJim Jagielski 
BasicFormat(double dNumber,String sFormatStrg)1056*b1cdbd2cSJim Jagielski String SbxBasicFormater::BasicFormat( double dNumber, String sFormatStrg )
1057*b1cdbd2cSJim Jagielski {
1058*b1cdbd2cSJim Jagielski 	sal_Bool bPosFormatFound,bNegFormatFound,b0FormatFound;
1059*b1cdbd2cSJim Jagielski 
1060*b1cdbd2cSJim Jagielski 	// analysiere Format-String auf vordefinierte Formate:
1061*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_GENERALNUMBER ) )
1062*b1cdbd2cSJim Jagielski 		sFormatStrg.AssignAscii( GENERALNUMBER_FORMAT );
1063*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_CURRENCY ) )
1064*b1cdbd2cSJim Jagielski 		sFormatStrg = sCurrencyFormatStrg; // old: CURRENCY_FORMAT;
1065*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_FIXED ) )
1066*b1cdbd2cSJim Jagielski 		sFormatStrg.AssignAscii( FIXED_FORMAT );
1067*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_STANDARD ) )
1068*b1cdbd2cSJim Jagielski 		sFormatStrg.AssignAscii( STANDARD_FORMAT );
1069*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_PERCENT ) )
1070*b1cdbd2cSJim Jagielski 		sFormatStrg.AssignAscii( PERCENT_FORMAT );
1071*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_SCIENTIFIC ) )
1072*b1cdbd2cSJim Jagielski 		sFormatStrg.AssignAscii( SCIENTIFIC_FORMAT );
1073*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_YESNO ) )
1074*b1cdbd2cSJim Jagielski 		return ( dNumber==0.0 ) ? sNoStrg : sYesStrg ;
1075*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_TRUEFALSE ) )
1076*b1cdbd2cSJim Jagielski 		return ( dNumber==0.0 ) ? sFalseStrg : sTrueStrg ;
1077*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_ONOFF ) )
1078*b1cdbd2cSJim Jagielski 		return ( dNumber==0.0 ) ? sOffStrg : sOnStrg ;
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski 	// analysiere Format-String auf ';', d.h. Format-Strings f"ur
1081*b1cdbd2cSJim Jagielski 	// positive-, negative- und 0-Werte
1082*b1cdbd2cSJim Jagielski 	String sPosFormatStrg = GetPosFormatString( sFormatStrg, bPosFormatFound );
1083*b1cdbd2cSJim Jagielski 	String sNegFormatStrg = GetNegFormatString( sFormatStrg, bNegFormatFound );
1084*b1cdbd2cSJim Jagielski 	String s0FormatStrg = Get0FormatString( sFormatStrg, b0FormatFound );
1085*b1cdbd2cSJim Jagielski 	//String sNullFormatStrg = GetNullFormatString( sFormatStrg, bNullFormatFound );
1086*b1cdbd2cSJim Jagielski 
1087*b1cdbd2cSJim Jagielski 	String sReturnStrg;
1088*b1cdbd2cSJim Jagielski 	String sTempStrg;
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski 	if( dNumber==0.0 )
1091*b1cdbd2cSJim Jagielski 	{
1092*b1cdbd2cSJim Jagielski 		sTempStrg = sFormatStrg;
1093*b1cdbd2cSJim Jagielski 		if( b0FormatFound )
1094*b1cdbd2cSJim Jagielski 		{
1095*b1cdbd2cSJim Jagielski 			// wurde ggf. Leer-String uebergeben ?
1096*b1cdbd2cSJim Jagielski 			if( s0FormatStrg.Len() == 0 && bPosFormatFound )
1097*b1cdbd2cSJim Jagielski 				// --> Ja, dann verwende String fuer positive Werte
1098*b1cdbd2cSJim Jagielski 				sTempStrg = sPosFormatStrg;
1099*b1cdbd2cSJim Jagielski 			else
1100*b1cdbd2cSJim Jagielski 				sTempStrg = s0FormatStrg;
1101*b1cdbd2cSJim Jagielski 		}
1102*b1cdbd2cSJim Jagielski 		else if( bPosFormatFound )
1103*b1cdbd2cSJim Jagielski 		{
1104*b1cdbd2cSJim Jagielski 			// verwende String fuer positive Werte
1105*b1cdbd2cSJim Jagielski 			sTempStrg = sPosFormatStrg;
1106*b1cdbd2cSJim Jagielski 		}
1107*b1cdbd2cSJim Jagielski 		ScanFormatString( dNumber, sTempStrg, sReturnStrg,/*bCreateSign=*/sal_False );
1108*b1cdbd2cSJim Jagielski 	}
1109*b1cdbd2cSJim Jagielski 	else
1110*b1cdbd2cSJim Jagielski 	{
1111*b1cdbd2cSJim Jagielski 		if( dNumber<0.0 )
1112*b1cdbd2cSJim Jagielski 		{
1113*b1cdbd2cSJim Jagielski 			if( bNegFormatFound )
1114*b1cdbd2cSJim Jagielski 			{
1115*b1cdbd2cSJim Jagielski 				// wurde ggf. Leer-String uebergeben ?
1116*b1cdbd2cSJim Jagielski 				if( sNegFormatStrg.Len() == 0 && bPosFormatFound )
1117*b1cdbd2cSJim Jagielski 				{
1118*b1cdbd2cSJim Jagielski 					// --> Ja, dann verwende String fuer positive Werte
1119*b1cdbd2cSJim Jagielski 					// und setzte Minus-Zeichen davor !
1120*b1cdbd2cSJim Jagielski 					sTempStrg = String::CreateFromAscii("-");
1121*b1cdbd2cSJim Jagielski 					sTempStrg += sPosFormatStrg;
1122*b1cdbd2cSJim Jagielski 				}
1123*b1cdbd2cSJim Jagielski 				else
1124*b1cdbd2cSJim Jagielski 					sTempStrg = sNegFormatStrg;
1125*b1cdbd2cSJim Jagielski 		   }
1126*b1cdbd2cSJim Jagielski 			else
1127*b1cdbd2cSJim Jagielski 				sTempStrg = sFormatStrg;
1128*b1cdbd2cSJim Jagielski 			// falls KEIN Format-String speziell f"ur negative Werte angegeben
1129*b1cdbd2cSJim Jagielski 			// wurde, so soll das Vorzeichen ausgegeben werden
1130*b1cdbd2cSJim Jagielski 			ScanFormatString( dNumber, sTempStrg, sReturnStrg,/*bCreateSign=*/bNegFormatFound/*sNegFormatStrg!=EMPTYFORMATSTRING*/ );
1131*b1cdbd2cSJim Jagielski 		}
1132*b1cdbd2cSJim Jagielski 		else // if( dNumber>0.0 )
1133*b1cdbd2cSJim Jagielski 		{
1134*b1cdbd2cSJim Jagielski 			ScanFormatString( dNumber,
1135*b1cdbd2cSJim Jagielski 					(/*sPosFormatStrg!=EMPTYFORMATSTRING*/bPosFormatFound ? sPosFormatStrg : sFormatStrg),
1136*b1cdbd2cSJim Jagielski 					sReturnStrg,/*bCreateSign=*/sal_False );
1137*b1cdbd2cSJim Jagielski 		}
1138*b1cdbd2cSJim Jagielski 	}
1139*b1cdbd2cSJim Jagielski 	return sReturnStrg;
1140*b1cdbd2cSJim Jagielski }
1141*b1cdbd2cSJim Jagielski 
isBasicFormat(String sFormatStrg)1142*b1cdbd2cSJim Jagielski sal_Bool SbxBasicFormater::isBasicFormat( String sFormatStrg )
1143*b1cdbd2cSJim Jagielski {
1144*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_GENERALNUMBER ) )
1145*b1cdbd2cSJim Jagielski 		return sal_True;
1146*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_CURRENCY ) )
1147*b1cdbd2cSJim Jagielski 		return sal_True;
1148*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_FIXED ) )
1149*b1cdbd2cSJim Jagielski 		return sal_True;
1150*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_STANDARD ) )
1151*b1cdbd2cSJim Jagielski 		return sal_True;
1152*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_PERCENT ) )
1153*b1cdbd2cSJim Jagielski 		return sal_True;
1154*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_SCIENTIFIC ) )
1155*b1cdbd2cSJim Jagielski 		return sal_True;
1156*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_YESNO ) )
1157*b1cdbd2cSJim Jagielski 		return sal_True;
1158*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_TRUEFALSE ) )
1159*b1cdbd2cSJim Jagielski 		return sal_True;
1160*b1cdbd2cSJim Jagielski 	if( sFormatStrg.EqualsIgnoreCaseAscii( BASICFORMAT_ONOFF ) )
1161*b1cdbd2cSJim Jagielski 		return sal_True;
1162*b1cdbd2cSJim Jagielski 	return sal_False;
1163*b1cdbd2cSJim Jagielski }
1164*b1cdbd2cSJim Jagielski 
1165