#ifndef __SCONTI_H #include "sconti.h" #endif const real TSconto::cento( "100" ); void TSconto::set( const TString& exp, bool signal ) { TString work( exp ); TString goodexp; TString num; // Elimina gli spazi molesti work.strip_spaces( ); // Per ora nessun errore _errorpos = -1; int i = 0; _part = 1.0; const int wlen = work.len( ); // Flag che indica se sono nella parte decimale di un numero bool dec = FALSE; // Flag che indica se si attende l'inizio di un numero bool startnum = TRUE; // Flag che indica se siamo all'inizio di un numero while ( i < wlen && _errorpos < 0 ) { char c = work[ i++ ]; switch( c ) { case '+': case '-': // Se ero in in numero ... if( !startnum ) { // Aggiunge il numero alla sequenza real newval( num ); _part = _part * ( cento + newval ) / cento; if( newval >= 0 ) goodexp << '+'; goodexp << num; } // Inizia il nuovo numero num = ( c == '-' )?"-":""; startnum = TRUE; dec = FALSE; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': num << c; startnum = FALSE; break; case '.': case ',': // Se siamo già nella parte decimale ... if( dec ) { // Segnala un errore _errorpos = i; break; } // Se occorrenva un numero ci metto lo 0 if( startnum ) num << '0'; // Interpreto la virgola come punto num << '.'; dec = TRUE; startnum = TRUE; break; default: _errorpos = i; break; } } // Controlla la validità _valid = ( _errorpos < 0 ); // Se richiesto segnala l'errore if( !_valid && signal ) warning_box( "Espressione di sconto non valida. Errore sul carattere %d.", _errorpos + 1 ); if( _valid ) { // Aggiunge l'ultimo numero preso real lastval( num ); _part = _part * ( cento + lastval ) / cento; if( lastval >= 0 ) goodexp << '+'; goodexp << num; // Assegna la nuova espressione formattata bene _exp = goodexp; } else { // Azzera la sequenza di percentuali _part = 1.0; } } real TSconto::sconto( ) { CHECK(is_valid( ),"Tentativo di usare uno sconto non valido!" ); return ( ( _part * cento ) - cento ); } void calcola_sconto_riga( TRectype riga ) { }