Fiz uma função para formatar números inteiros com separadores de milhares, com alguns macros para os tipos mais comuns de separadores:
#include <stdio.h>
#include <string.h>
#define dotsep(x) format_int(x, '.', 3)
#define commasep(x) format_int(x, ',', 3)
#define underscoresep(x) format_int(x, '_', 3)
#define spacesep(x) format_int(x, ' ', 3)
#define singlequotesep(x) format_int(x, '\'', 3)
#define chinesesep(x) format_int(x, ',', 4)
char *format_int(long long int n, char sep, int count){
static char format_int_string[64] = "";
int length = sprintf(format_int_string, "%lld", n);
if (count < 1) return format_int_string;
char *start = format_int_string;
if (format_int_string[0] == '-') {
start++;
length--;
}
for (int i = length - count, j = 1; i > 0; i -= count, j++) {
memmove(start + i + 1, start + i, length - i + j);
start[i] = sep;
}
return format_int_string;
}
E alguns exemplos de uso da função e dos macros:
int main()
{
printf("%s\n", format_int(1000000000, '.', 3));
printf("%s\n", format_int(-1000000000, '.', 3));
printf("%s\n", format_int(1, '.', 3));
printf("%s\n", format_int(0, '.', 3));
printf("%s\n", format_int(-1, '.', 3));
printf("%s\n", format_int(-100, '.', 3));
printf("%s\n", format_int(-100000000, '.', 3));
printf("%s\n", format_int(1000000000, '.', 2));
printf("%s\n", format_int(1000000000, '.', 1));
printf("%s\n", format_int(1000000000, '.', 0));
printf("%s\n", format_int(1000000000, '.', -1));
printf("\n%s\n", dotsep(1000000000));
printf("%s\n", commasep(1000000000));
printf("%s\n", underscoresep(1000000000));
printf("%s\n", spacesep(1000000000));
printf("%s\n", singlequotesep(1000000000));
printf("%s\n", chinesesep(1000000000));
return 0;
}