본문 바로가기

Native/C

float to str

/***************************************************************************
*
*        Date        : 2005-04-14
*        Copyright    : aucd29
*        E-mail        : aucd29@daum.net
*
*        실수를 문자형으로 바꾸라
*
***************************************************************************/

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

#define MAX 1000

void Reverse(char *);
void IntToStr(char *, int, int);
void SosuToStr(char *, double);
void Join(char *, char *);

int main(int argc, char *argv[])
{
    double fInput=0.0;
    char s[MAX],sign=0;
    char s2[MAX];
    int iInput=0;

    scanf("%lf",&fInput);

    printf("Input data : %lf\n", fInput);

    if(fInput < 0.0)
    {
        sign=1;        
        fInput *= -1;
    }
    
    iInput = (int)fInput;
    
    IntToStr(s,iInput,sign);    // 소수점 이상을 떼주고
    Reverse(s);                // 돌리고

    //printf("%d, %f, %f\n",iInput, fInput, fInput-iInput);

    SosuToStr(s2,(fInput - iInput));
    //printf("바꼇냐? : %s\n",s2);
    Reverse(s2);
    //printf("바꼇냐?2 : %s\n",s2);
    Join(s,s2);

    printf("output data : %s\n",s);

    return 0;
}

void IntToStr(char *s, int iInput, int kind)
{
    int i=0;
    while(1)
    {
        if(iInput)
        {
            s[i++] = (iInput % 10) + '0';
            iInput /=10;
        } else break;
    }

    if(kind)
    {
        s[i]='-';
        s[i+1]='\0';
    }
    else s[i]='\0';
}

//
// 문자 뒤집자
//
void Reverse(char *s)
{
    int i=0, len = strlen(s)-1;
    char tmp;

    while(i<len)
    {
        tmp = s[len];
        s[len] = s[i];
        s[i] = tmp;
        ++i;--len;
    }
}

//
// 소수점 처리
//
void SosuToStr(char *s, double val2)
{
    int i=0,c,val;
    
    val = (int)(val2 * 1000000);    
    do
    {
        if((c=(val % 10)) || i>0)
        {
            s[i] = c + '0';
            ++i;
        }
    }
    while(val/=10);
    s[i]='\0';    
}

//
// 두개의 문자열을 합친다. s, s2를 s+=s2한다.
//
void Join(char *s, char *s2)
{
    int len = strlen(s), j=0;
    char c;

    s[len] = '.';

    while((c=s2[j++])!='\0')
    {
        s[++len] = c;
    }
    s[++len] = '\0';
    s2[0] = '\0';    // s2 free
}

'Native > C' 카테고리의 다른 글

에제 2-4  (0) 2013.10.02
StrMove (문자열에서 특정이후 문자를 수만큼 이동)  (0) 2013.10.02
Circular shift complete ver  (0) 2013.10.02
reverse  (0) 2013.10.02
104  (0) 2013.10.02