Skip to content

Instantly share code, notes, and snippets.

@mashingan
Last active August 14, 2022 12:54
Show Gist options
  • Save mashingan/612fc8ba44c1b0466d67381e9066ebac to your computer and use it in GitHub Desktop.
Save mashingan/612fc8ba44c1b0466d67381e9066ebac to your computer and use it in GitHub Desktop.
Contoh konversi integer menjadi string representasi
// 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