How to check if scientific notation is double or not C ++

I basically want to check if a string is a valid scientific double or not.

So basically, if the string had a type a

character, or just a few characters like help

or 0.a

, then this would be considered a non-scientific double and discarded, however something like 1.234E+9

or 2.468E9

would be retained as that is an acceptable value

I wrote some code to deal with this, but I need help ... differentiating the scientific double and only some characters

char *temp;
int u=0;
int arrayLen = strlen(temp);
for(int i=0; i<len; i++)
{
  if(isalpha(temp[i]))
  {
    if((temp[i] == 'e') && (!isalpha(temp[i-1])))
    {
      break;
    }
    u++;
  }
}

if(u > 0)
{
   temp[0] = 0;
   break;
}

      

+3


source to share


1 answer


As TC suppose, use strtod. But check the return pointer to see if it has read all of the content.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

double convert_number( const char * num )
{
   char * endptr = 0;
   double retval;
   retval = strtod( num, &endptr );
   return ( !endptr || ( *endptr != '\0' ) ) ? 0 : retval;
}


int main( int argc, char ** argv )
{
    int index;
    for( index = 0; index < argc; ++index )
        printf( "%30s --> %f\n", argv[index], convert_number( argv[index] ) );
    return 0;
}

      

Example:

./a.out 13.2425 99993.3131.1134  13111.34e313e2  1313e4 1 324.3 "2242e+3"
                       ./a.out --> 0.000000
                       13.2425 --> 13.242500
               99993.3131.1134 --> 0.000000
                13111.34e313e2 --> 0.000000
                        1313e4 --> 13130000.000000
                             1 --> 1.000000
                         324.3 --> 324.300000
                       2242e+3 --> 2242000.000000

      

-------------------- ALTERNATIVE REQUEST ------------------------ ----



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int convert_number( const char * num, double * retval )
{
   char * endptr = 0;
   *retval = strtod( num, &endptr );
   return ( !endptr || ( *endptr != '\0' ) ) ? 0 : 1;
}


int main( int argc, char ** argv )
{
    int index;
    double dvalue;
    for( index = 0; index < argc; ++index )
        if( convert_number( argv[index], &dvalue ) )
            printf( "%30s --> %f\n", argv[index], dvalue );
        else
            printf( "%30s --> Rejected\n", argv[index], dvalue );
    return 0;
}

      

Results:

./a.out 13.2425 99993.3131.1134  13111.34e313e2  1313e4 1 324.3 "2242e+3" 0.0
                       ./a.out --> Rejected
                       13.2425 --> 13.242500
               99993.3131.1134 --> Rejected
                13111.34e313e2 --> Rejected
                        1313e4 --> 13130000.000000
                             1 --> 1.000000
                         324.3 --> 324.300000
                       2242e+3 --> 2242000.000000
                           0.0 --> 0.000000

      

Newbie version:

int convert_number( const char * num, double * retval )
{
   char * endptr = 0; /* Prepare a pointer for strtod to inform us where it ended extracting the double from the string. */
   *retval = strtod( num, &endptr );  /* Run the extraction of the double from the source string (num) and give us the value so we can store it in the address given by the caller (retain the position in the string where strtod stopped processing). */
   if( endptr == NULL )
       return 0;  /* endptr should never be NULL, but it is a defensive programming to prevent dereferencing null in the next statement. */
   else if( *endptr != '\0 ) /* If we are pointing to a non-null character, then there was an invalid character that strtod did not accept and stopped processing.  So it is not only a double on the line.  So we reject. */
       return 0; /* Not strictly the double we are looking for. */ 
   /* else */
   return 1;  /* Return 1 to the caller to indicate truth (non-zero) that the value in *retval has valid double value to use. */
}

      

+2


source







All Articles