///////////////////////////////////////////////////////////////////////////////
//      실수 안쓰기 프로젝트
//
//      PC는 CPU안에 실수연산기가 있어서 실수연산도 속도가 빠르지만
//      마이컴에서 실수를 다루면 엄청나게 느려집니다.
//      sin,cos 수학연산 다루는거 아니라면 실수가 거의 필요치 않습니다.
///////////////////////////////////////////////////////////////////////////////

#pragma warning(disable:4996)   //보안에 취약하다는 잔소리를 없앰
#include <stdio.h>
#include <string.h>     //strcpy()

//이 함수를 윈도우즈에서 쓰기 위해 윈도우즈 코딩 스타일로 전환
typedef char*   LPSTR;
typedef int     BOOL;
#define FALSE   0
#define lstrcpy strcpy
#define WINAPI  _stdcall

//-----------------------------------------------------------------------------
//      정수를 소숫점 문자열로 만들어 줍니다 (음수도 처리함)
//
//      Buff의 크기는 16이상일 것
//      CommaUnit: 정수부분에 몇자리 마다 ','를 찍을지, 0을 주면 ','안찍음
//      FractionUnit: 하위 몇자리를 소수점 이하로 표시할지, 음수로 주어야 함 (0은 모두 정수로)
//      FractionZFillFg: TRUE를 주면 수숫점 이후가 0이여도 표시함
//-----------------------------------------------------------------------------
LPSTR WINAPI JItoA(LPSTR Buff, int Value, int CommaUnit, int FractionUnit, BOOL FractionZFillFg)
    {
    int  FirstFg=1, Minus=0;
    char Cha;
    LPSTR lp;

    if (Value<0) {Value=-Value; Minus=1;}
    lp=Buff+15; lp[0]=0;

    if (FractionZFillFg==0 && Value==0) *--lp='0';
    else{
        do  {
            Cha=(Value%10)+'0';
            Value/=10;
            if (FractionUnit>=0)
                {
                if (CommaUnit!=0 && FractionUnit!=0 && (FractionUnit%CommaUnit)==0) *--lp=',';
                *--lp=Cha;
                }
            else{
                if (FractionZFillFg!=FALSE || Cha!='0' || FirstFg==0 || Value==0)
                    {
                    FirstFg=0;
                    *--lp=Cha;
                    if (FractionUnit==-1) *--lp='.';
                    }
                }
            FractionUnit++;
            } while (Value!=0);

        while (FractionUnit<0)
            {
            *--lp='0';
            if (++FractionUnit==0) *--lp='.';
            }

        if (FractionUnit==0) *--lp='0';
        if (Minus) *--lp='-';
        }
    lstrcpy(Buff, lp);
    return Buff;
    }

int main()
    {
    char szTmp[16];

    printf("JItoA(szTmp, 1234567890, 0, 0,0) => %s\\n", JItoA(szTmp, 1234567890, 0,0,0));
    printf("JItoA(szTmp, 1234567890, 3, 0,0) => %s\\n", JItoA(szTmp, 1234567890, 3,0,0));
    printf("JItoA(szTmp, 1234567890, 3,-2,0) => %s\\n", JItoA(szTmp, 1234567890, 3,-2,0));
    printf("JItoA(szTmp, 1234567890, 3,-2,1) => %s\\n", JItoA(szTmp, 1234567890, 3,-2,1));
    printf("JItoA(szTmp, 1234560000, 3,-2,1) => %s\\n", JItoA(szTmp, 1234560000, 3,-2,1));
    printf("JItoA(szTmp,-1234560000, 3,-2,0) => %s\\n", JItoA(szTmp,-1234560000, 3,-2,0));
    printf("JItoA(szTmp,    0, 0,-3,0) => %s\\n", JItoA(szTmp,    0, 0,-3,0));
    printf("JItoA(szTmp,    0, 0,-3,1) => %s\\n", JItoA(szTmp,    0, 0,-3,1));
    printf("JItoA(szTmp, 1000, 0,-3,0) => %s\\n", JItoA(szTmp, 1000, 0,-3,0));
    printf("JItoA(szTmp, 1000, 0,-3,1) => %s\\n", JItoA(szTmp, 1000, 0,-3,1));
    printf("JItoA(szTmp,  123, 0,-3,1) => %s\\n", JItoA(szTmp,  123, 0,-3,1));
    printf("7은 9의 %s%%입니다.\\n", JItoA(szTmp, 7*100*100/9, 0,-2,1));
    }

/*
결과
JItoA(szTmp, 1234567890, 0, 0,0) => 1234567890
JItoA(szTmp, 1234567890, 3, 0,0) => 1,234,567,890
JItoA(szTmp, 1234567890, 3,-2,0) => 12,345,678.9
JItoA(szTmp, 1234567890, 3,-2,1) => 12,345,678.90
JItoA(szTmp, 1234560000, 3,-2,1) => 12,345,600.00
JItoA(szTmp,-1234560000, 3,-2,0) => -12,345,600
JItoA(szTmp,    0, 0,-3,0) => 0
JItoA(szTmp,    0, 0,-3,1) => 0.000
JItoA(szTmp, 1000, 0,-3,0) => 1
JItoA(szTmp, 1000, 0,-3,1) => 1.000
JItoA(szTmp,  123, 0,-3,1) => 0.123
7은 9의 77.77%입니다.
*/