1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
int string_to_ldouble( const char * z , long double * val , const char point )
{
int sign = 1 ;
long double po = 1 ;
long double v = 0.0 ;
size_t i = 0 ;
if( z == NULL ) return -1 ; // la chaîne est null
while( z[i] == ' ') i++ ;
if( z[i] == '\0' ) return 1 ; // la chaîne est vide
if( z[i] == '-' ) sign = -1 ;
if( z[i] == '+' ) sign = 1 ;
if( z[i] == '+' || z[i] == '-' ) i++ ;
while( z[i] == ' ' ) i++ ;
if( z[i] == '\0' ) // il n'y a plus rien apès le signe
{
return 2 ;
}
for( ; z[i] && ( isdigit(z[i]) ) ; i++ )
v = v * 10 + ( z[i] - '0' ) ;
if( z[i] != point )
{ while ( z[i] )
if ( z[i++] != ' ' ) return 3 ; // est-ce un entier ?
}
else
if( z[i] == point && isdigit(z[i+1] ) )
{
i++ ;
for( ; z[i] && ( isdigit(z[i] ) ) ; i++ )
{
po *= 10 ;
v = v + ( z[i] - '0' ) / po ;
}
}
while ( z[i] )
if ( z[i++] != ' ' ) return 4 ; // la fin de la chaîne est-elle propre ?
v = sign * v ;
*val = v ;
return 0 ; // zéro pas de problème
} |
Partager