Write a C function ftoa() that converts a given floating-point number or a double to a string. Use of standard library functions for direct conversion is not allowed. The following is prototype of ftoa(). The article provides insight of conversion of C double to string.
ftoa(n, res, afterpoint) n --> Input Number res[] --> Array where output string to be stored afterpoint --> Number of digits to be considered after the point.
Example:
- ftoa(1.555, str, 2) should store “1.55” in res.
- ftoa(1.555, str, 0) should store “1” in res.
We strongly recommend to minimize the browser and try this yourself first. A simple way is to use sprintf(), but use of standard library functions for direct conversion is not allowed. Approach: The idea is to separate integral and fractional parts and convert them to strings separately. Following are the detailed steps.
- Extract integer part from floating-point or double number.
- First, convert integer part to the string.
- Extract fraction part by exacted integer part from n.
- If d is non-zero, then do the following.
- Convert fraction part to an integer by multiplying it with pow(10, d)
- Convert the integer value to string and append to the result.
Following is C implementation of the above approach.
// C program for implementation of ftoa() #include <math.h> #include <stdio.h> // Reverses a string 'str' of length 'len' void reverse( char * str, int len)
{ int i = 0, j = len - 1, temp;
while (i < j) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++;
j--;
}
} // Converts a given integer x to string str[]. // d is the number of digits required in the output. // If d is more than the number of digits in x, // then 0s are added at the beginning. int intToStr( int x, char str[], int d)
{ int i = 0;
while (x) {
str[i++] = (x % 10) + '0' ;
x = x / 10;
}
// If number of digits required is more, then
// add 0s at the beginning
while (i < d)
str[i++] = '0' ;
reverse(str, i);
str[i] = '\0' ;
return i;
} // Converts a floating-point/double number to a string. void ftoa( float n, char * res, int afterpoint)
{ // Extract integer part
int ipart = ( int )n;
// Extract floating part
float fpart = n - ( float )ipart;
// convert integer part to string
int i = intToStr(ipart, res, 0);
// check for display option after point
if (afterpoint != 0) {
res[i] = '.' ; // add dot
// Get the value of fraction part upto given no.
// of points after dot. The third parameter
// is needed to handle cases like 233.007
fpart = fpart * pow (10, afterpoint);
intToStr(( int )fpart, res + i + 1, afterpoint);
}
} // Driver program to test above function int main()
{ char res[20];
float n = 233.007;
ftoa(n, res, 4);
printf ( "\"%s\"\n" , res);
return 0;
} |
"233.0070"
Time Complexity: O(logn)
Auxiliary Space: O(1)
Note: The program performs similar operation if instead of float, a double type is taken.