///////////////////////////////////////////////////////////////////////////////
// 실수 안쓰기 프로젝트
//
// 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%입니다.
*/