EgtGeneral 1.6d1 :

- aggiunte FromString e ToString per INTVECTOR e DBLVECTOR.
This commit is contained in:
Dario Sassi
2015-04-16 06:39:10 +00:00
parent bdab96b800
commit fcde284912
2 changed files with 114 additions and 35 deletions
+114 -35
View File
@@ -21,6 +21,74 @@
using namespace std ;
//----------------------------------------------------------------------------
static inline void
SkipSpaces( const char*& pC)
{
while ( *pC == ' ' || *pC == '\t')
++ pC ;
}
//----------------------------------------------------------------------------
static inline void
SkipSpaces( char*& pC)
{
while ( *pC == ' ' || *pC == '\t')
++ pC ;
}
//----------------------------------------------------------------------------
bool
FromString( const string& sVal, INTVECTOR& vnVal)
{
// pulisco il vettore dei risultati
vnVal.clear() ;
// reset errori di conversione
errno = 0 ;
// ciclo sui caratteri della stringa
const char* pStart = sVal.c_str() ;
SkipSpaces( pStart) ;
while ( *pStart >= '0' && *pStart <= '9') {
char* pStop ;
int nVal = strtol( pStart, &pStop, 10) ;
vnVal.push_back( nVal) ;
SkipSpaces( pStop) ;
if ( *pStop == '\0' && errno == 0)
return true ;
if ( *pStop != ',' || errno != 0)
return false ;
pStart = pStop + 1 ;
SkipSpaces( pStart) ;
}
return ( *pStart == '\0' && errno == 0) ;
}
//----------------------------------------------------------------------------
bool
FromString( const string& sVal, DBLVECTOR& vdVal)
{
// pulisco il vettore dei risultati
vdVal.clear() ;
// reset errori di conversione
errno = 0 ;
// ciclo sui caratteri della stringa
const char* pStart = sVal.c_str() ;
SkipSpaces( pStart) ;
while ( *pStart >= '0' && *pStart <= '9') {
char* pStop ;
double dVal = strtod( pStart, &pStop) ;
vdVal.push_back( dVal) ;
SkipSpaces( pStop) ;
if ( *pStop == '\0' && errno == 0)
return true ;
if ( *pStop != ',' || errno != 0)
return false ;
pStart = pStop + 1 ;
SkipSpaces( pStart) ;
}
return ( *pStart == '\0' && errno == 0) ;
}
//----------------------------------------------------------------------------
const string
ToString( double dVal, int nPrec)
@@ -28,21 +96,13 @@ ToString( double dVal, int nPrec)
const double BIG_NUMBER = 1e10 ;
const int BIG_DIGITNBR = 10 ;
const int MAX_PREC = 12 ;
char szBuff[24] ;
char szDest[32] ;
char* pBuff ;
char* pDest ;
int nErr ;
int nDecimal ;
int nSign ;
int nExp ;
int nTmp ;
// verifico la precisione
nPrec = min( nPrec, MAX_PREC) ;
// converto la mantissa
char szBuff[24] ;
int nErr, nDecimal, nSign ;
if ( fabs( dVal) < BIG_NUMBER)
nErr = _fcvt_s( szBuff, dVal, nPrec, &nDecimal, &nSign) ;
else
@@ -59,6 +119,7 @@ ToString( double dVal, int nPrec)
return "0" ;
// verifica per forma esponenziale
int nExp ;
if ( nDecimal > BIG_DIGITNBR) {
nExp = nDecimal - 1 ;
nDecimal = 1 ;
@@ -67,8 +128,9 @@ ToString( double dVal, int nPrec)
nExp = 0 ;
// puntatori a inizio stringhe
pBuff = szBuff ;
pDest = szDest ;
char szDest[32] ;
char* pBuff = szBuff ;
char* pDest = szDest ;
// eventuale inserimento segno '-'
if ( nSign != 0) {
*pDest = '-' ;
@@ -116,7 +178,7 @@ ToString( double dVal, int nPrec)
if ( nExp > 0) {
*pDest = 'e' ;
pDest ++ ;
nTmp = nExp ;
int nTmp = nExp ;
if ( nTmp >= 100) {
*pDest = '0' + ( nTmp / 100) ;
pDest ++ ;
@@ -138,16 +200,45 @@ ToString( double dVal, int nPrec)
return szDest ;
}
//----------------------------------------------------------------------------
const string
ToString( const INTVECTOR& vnVal, int nPrec)
{
// se vettore vuoto, stringa vuota
if ( vnVal.empty())
return "" ;
// costruisco la stringa
string sDest ;
sDest.reserve( 8 * vnVal.size()) ;
for ( size_t i = 0 ; i < vnVal.size() ; ++ i)
sDest += ToString( vnVal[i], nPrec) + "," ;
sDest.pop_back() ;
return sDest ;
}
//----------------------------------------------------------------------------
const string
ToString( const DBLVECTOR& vdVal, int nPrec)
{
// se vettore vuoto, stringa vuota
if ( vdVal.empty())
return "" ;
// costruisco la stringa
string sDest ;
sDest.reserve( 14 * vdVal.size()) ;
for ( size_t i = 0 ; i < vdVal.size() ; ++ i)
sDest += ToString( vdVal[i], nPrec) + "," ;
sDest.pop_back() ;
return sDest ;
}
//----------------------------------------------------------------------------
void
Split( const string& sString, const string& sSeparator, bool bFirstVsLast,
string& sFirst, string& sLast)
{
string::size_type iPos ;
// cerco il separatore
iPos = ( bFirstVsLast ? sString.find( sSeparator) : sString.rfind( sSeparator)) ;
string::size_type iPos = ( bFirstVsLast ? sString.find( sSeparator) : sString.rfind( sSeparator)) ;
// se trovato
if ( iPos != string::npos) {
if ( iPos > 0)
@@ -170,24 +261,19 @@ Split( const string& sString, const string& sSeparator, bool bFirstVsLast,
bool
Tokenize( const string& sString, const string& sSeparators, STRVECTOR& vsTokens)
{
string::size_type iPosStart ;
string::size_type iPosEnd ;
// pulisco il risultato
vsTokens.clear() ;
// parto dall'inizio
iPosStart = ( sString.empty() ? string::npos : 0) ;
string::size_type iPosStart = ( sString.empty() ? string::npos : 0) ;
// mentre esiste un nuovo inizio di token
while ( iPosStart != string::npos) {
// cerco il primo separatore
iPosEnd = sString.find_first_of( sSeparators, iPosStart) ;
string::size_type iPosEnd = sString.find_first_of( sSeparators, iPosStart) ;
// aggiungo il token al vettore
vsTokens.push_back( sString.substr( iPosStart, iPosEnd - iPosStart)) ;
// cerco l'inizio di un nuovo token
iPosStart = sString.find_first_not_of( sSeparators, iPosEnd) ;
}
return true ;
}
@@ -200,7 +286,6 @@ Tokenize( const string& sString, const string& sSeparators,
if ( sAtomStarts.find_first_of( sSeparators) != string::npos ||
sAtomEnds.find_first_of( sSeparators) != string::npos)
return false ;
// pulisco il risultato
vsTokens.clear() ;
// se la stringa è vuota non c'è niente da cercare
@@ -240,26 +325,20 @@ Tokenize( const string& sString, const string& sSeparators,
// se è rimasto un ultimo token
if ( iPosStart != string::npos)
vsTokens.push_back( sString.substr( iPosStart)) ;
return true ;
}
//----------------------------------------------------------------------------
int
ReplaceString( std::string& sString, const std::string& sOld, const std::string& sNew)
ReplaceString( string& sString, const string& sOld, const string& sNew)
{
int nSubs ;
size_t pos ;
nSubs = 0 ;
pos = 0 ;
while ( ( pos = sString.find( sOld, pos)) != std::string::npos) {
int nSubs = 0 ;
size_t pos = 0 ;
while ( ( pos = sString.find( sOld, pos)) != string::npos) {
sString.replace( pos, sOld.length(), sNew) ;
pos += sNew.length() ;
nSubs ++ ;
}
return nSubs ;
}