campo-sirio/ve/sconti.cpp
matteo e926136139 Aggiunto un include per la configurazione con la definizione di
costanti per listini/contratti e campagne. Pubblicato l'elenco
delle variabili di configurazione di VE.


git-svn-id: svn://10.65.10.50/trunk@1843 c028cbd2-c16b-5b4b-a496-9718f37d4682
1995-09-18 09:58:41 +00:00

117 lines
2.6 KiB
C++
Executable File

#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 )
{
}