Tag Archives: atod

atod function’s work is identical to atoi‘s. But this one is for doubles

// for texting/ example purposes
#include <iostream> // for cout and endl
#include <cmath> // for pow
using namespace std; // so we don't have to do std::coud or std::endl
//end testing/ example purposes
char* substr(char* str, int start, int end){
char* a = new char[1+(end-start)]; // we need a new char array for the return
for(int i=start; i<end; i++){ // loop through the string
a[i-start] = str[i]; // set the characters in the new char array to those from the old one compensating for the substring
}
a[end-start] = '\0'; // add the null character, so we can output
return a; // return
}
double atod(char* a){
double retVal = atoi(a); // start off getting the number, assuming it is a valid string to use atoi on.
int start = 0;
int end = 0;
for(int i=0; a[i] != '\0'; i++){ // loop through the string to find the positions of the decimal portion, if there is one
if(a[i] == '.' && start == 0){
start = i+1; // set the start position to 1 more than the current (avoids a char as the first character - we want a digit)
}
else if(start != 0 && (a[i] < '0' || a[i] > '9')){ // make sure that start is set and that we aren't looking at digits
end = i; // if so, set the end location for the substring
break; // we don't need to continue anymore - break out of the loop
}
}
if(end > start){ // avoids substring problems.
char* decimal = substr(a, start, end); // get the string that is after the decimal point
int dec = atoi(decimal); // make it an integer
int power = end-start; // find the power of 10 we need to divide by
retVal += ((double)dec)/(pow(10.0, (double)power)); // divide and add to the return value (thus making it a true double)
}
return retVal; // return - simple enough
}
// for testing/ example purposes
int main(){
cout << atod("127.02501 test") << endl; // test it out on a valid character stream
return 0;
}
// end testing/ example purposes