Last active
August 14, 2022 12:54
-
-
Save mashingan/612fc8ba44c1b0466d67381e9066ebac to your computer and use it in GitHub Desktop.
Contoh konversi integer menjadi string representasi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// need link with math lib hence link with -lm, e.g.: | |
// gcc int-str-repr.c -lm | |
// or simply using tcc like: | |
// tcc int-str-repr.c | |
#include <stdio.h> | |
#include <math.h> | |
#include <stdlib.h> | |
#include <stdbool.h> | |
#include <string.h> | |
void printSingleDigit(int num) { | |
const char* repr[10] = { | |
"puluh", "se", "dua", "tiga", "empat", | |
"lima", "enam", "tujuh", "delapan", "sembilan" | |
}; | |
printf("%s", repr[num]); | |
} | |
void printTens(int magn) { | |
const char* tens[] = {"puluh", "ratus", "ribu"}; | |
printf("%s", tens[(magn-1)%3]); | |
} | |
void printConverted(int); | |
int printAndGetNum(int num, int base, const char *label) { | |
int denom = (int)pow(10, base); | |
printConverted(num / denom); | |
printf(" %s ", label); | |
return num % denom; | |
} | |
void printConverted(int num) { | |
bool teen = false; | |
while (num > 9) { | |
if (num > 10 && num < 20) { | |
num = num % 10; | |
printSingleDigit(num); | |
if (num != 1) printf(" "); | |
printf("belas"); | |
teen = true; | |
break; | |
} | |
int magn = (int)log10((float)num); | |
int denum = (int)pow(10, magn); | |
int digit1 = num / denum; | |
if (magn >= 9) { | |
num = printAndGetNum(num, 9, "milyar"); | |
} else if (magn >= 6) { | |
num = printAndGetNum(num, 6, "juta"); | |
} else if (magn >= 3) { | |
num = printAndGetNum(num, 3, "ribu"); | |
} else { | |
printSingleDigit(digit1); | |
if (digit1 != 1) printf(" "); | |
printTens(magn); | |
num = num % denum; | |
printf(" "); | |
} | |
} | |
if (!teen) { | |
if (num == 1) printf("satu"); | |
else if (num == 0); | |
else printSingleDigit(num); | |
} | |
} | |
int printSingleDigit2(char *dst, int num) { | |
char* repr[10] = { | |
"puluh", "se", "dua", "tiga", "empat", | |
"lima", "enam", "tujuh", "delapan", "sembilan" | |
}; | |
int len = 0; | |
for (char* s = repr[num], c = *s; c != '\0'; s++, c = *s, len++) { | |
*dst = c; | |
dst++; | |
} | |
*dst = '\0'; | |
return len; | |
} | |
int printTens2(char *dst, int magn) { | |
char* tens[] = {"puluh", "ratus", "ribu"}; | |
int len = 0; | |
for (char *s = tens[(magn-1)%3], c = *s; c != '\0'; s++, c = *s, len++) { | |
*dst = c; | |
dst++; | |
} | |
*dst = '\0'; | |
return len; | |
} | |
int printConverted2(char *dst, int num); | |
int printAndGetNum2(char *dst, int num, int base, const char *label, int labelen, int *outmagn) { | |
int denom = (int)pow(10, base); | |
int len = printConverted2(dst, num / denom); | |
dst += len; | |
*dst = ' '; | |
dst++; | |
strcpy(dst, label); | |
dst += labelen; | |
*dst = '\0'; | |
len += labelen + 1; | |
*outmagn = num % denom; | |
if (*outmagn > 9) { | |
*dst = ' '; | |
dst++; | |
len++; | |
*dst = '\0'; | |
} | |
return len; | |
} | |
int printConverted2(char *dst, int num) { | |
bool teen = false; | |
int len = 0; | |
if (num == 0) { | |
strcpy(dst, "nol"); | |
*(dst+3) = '\0'; | |
return 3; | |
} | |
if (num < 0) { | |
const char neg[] = "negatif "; | |
strcpy(dst, neg); | |
len = (sizeof(neg) / sizeof(char))-1; | |
dst += len; | |
*dst = '\0'; | |
num = -1*num; | |
} | |
while (num > 9) { | |
if (num > 10 && num < 20) { | |
num = num % 10; | |
int singlen = printSingleDigit2(dst, num); | |
len += singlen; | |
dst += singlen; | |
if (num != 1) { | |
*dst = ' '; | |
dst++; | |
len++; | |
} | |
strcpy(dst, "belas"); | |
dst += 5; | |
len += 5; | |
*dst = '\0'; | |
teen = true; | |
break; | |
} | |
int magn = (int)log10((float)num); | |
int denum = (int)pow(10, magn); | |
int digit1 = num / denum; | |
if (magn >= 9) { | |
int plen = printAndGetNum2(dst, num, 9, "milyar", 6, &num); | |
dst += plen; | |
len += plen; | |
} else if (magn >= 6) { | |
int plen = printAndGetNum2(dst, num, 6, "juta", 4, &num); | |
dst += plen; | |
len += plen; | |
} else if (magn >= 3) { | |
int plen = printAndGetNum2(dst, num, 3, "ribu", 4, &num); | |
dst += plen; | |
len += plen; | |
} else { | |
int singlen = printSingleDigit2(dst, digit1); | |
len += singlen; | |
dst += singlen; | |
if (digit1 != 1) { | |
*dst = ' '; | |
dst++; | |
len++; | |
} | |
int maglen = printTens2(dst, magn); | |
dst += maglen; | |
len += maglen; | |
*dst = ' '; | |
dst++; | |
len++; | |
num = num % denum; | |
} | |
} | |
if (!teen) { | |
if (num == 1) { | |
strcpy(dst, "satu"); | |
dst += 4; | |
len += 4; | |
} | |
else if (num == 0) { | |
dst--; | |
len--; | |
} | |
else { | |
int singlen = printSingleDigit2(dst, num); | |
dst += singlen; | |
len += singlen; | |
} | |
*dst = '\0'; | |
} | |
return len; | |
} | |
void checkNum(char *buf, int num) { | |
int len = printConverted2(buf, num); | |
printf("num %d repr as '%s' with buf length %d\n", num, buf, len); | |
memset(buf, '\0', len); | |
} | |
int main(int argc, char* argv[]) { | |
/* | |
if (argc < 2) { | |
printf("provide arg as num"); | |
exit(EXIT_FAILURE); | |
} | |
int num = atoi(argv[1]); | |
*/ | |
int numtest[] = { | |
1 | |
, 18 | |
, 38 | |
, 585 | |
, 8525 | |
, 38595 | |
, 739585 | |
, 9717585 | |
}; | |
printf("===print conversion\n"); | |
for (int i = 0; i < sizeof(numtest)/sizeof(numtest[0]); i++) { | |
printf("num %d is repr as '", numtest[i]); printConverted(numtest[i]); printf("'\n"); | |
} | |
printf("===string conversion\n"); | |
char buf[1024]; | |
for (int i = 0; i < sizeof(numtest)/sizeof(numtest[0]); i++) { | |
checkNum(buf, numtest[i]); | |
} | |
for(int i = -21; i <= 100; i++) { | |
checkNum(buf, i); | |
} | |
checkNum(buf, 500); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment