atod function

Standard

Add to DiggAdd to FaceBookAdd to Google BookmarkAdd to MySpaceAdd to Twitter
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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s