Jump to content

Existe jeito de exibir o separador de milhar "." usando a função printf da linguagem C?


acbdev

Postagens Recomendadas

Olá! Quem puder me ajudar eu agradeço. Estou fazendo um programinha simples em linguagem C que retorna números bem grandes para o sistema operacional (no caso o antigo prompt do DOS, o CMD do Windows). Eu gostaria de exibir esses números com os milhares separados pelo ponto ex: 1.968.369.321. Tentei de todo jeito e não consegui. Pesquisei muito os códigos de formatação e a biblioteca locale.h mas não deu certo. O máximo que consegui foi mudar o sinal de decimal "." para "," conforme nos costumamos usar aqui no Brasil. Obrigado desde já!

Separar milhres.jpg

Link to comment
Compartilhe em outros sites

  • 4 weeks later...

Olá!

Para formatar os números grandes com pontos você pode tentar essa pequena solução abaixo

#include <stdio.h>
#include <string.h>

int main() {
    long int number = 1233968369321;
    char str[20];
    sprintf(str, "%ld", number);

    int length = strlen(str);
    for (int i = length - 3; i > 0; i -= 3) {
        // inserir um ponto a cada três dígitos, começando da direita para a esquerda
        memmove(str + i + 1, str + i, strlen(str + i) + 1);
        str[i] = '.';
    }

    printf("%s\n", str);
    return 0;
}

 

  • Curtir 2
Link to comment
Compartilhe em outros sites

  • 9 months later...

#include <stdio.h>
#include <string.h>

void formatarNumero(long long numero) {
    char buffer[30];  // Ajuste conforme necessário (espaço para armazenar o número convertido em string)
    snprintf(buffer, sizeof(buffer), "%lld", numero);  // Converte o número para uma string e a armazena em buffer

    int tamanho = strlen(buffer);  // Obtém o tamanho da string
    int pontoIndex = tamanho % 3;  // Calcula o índice onde o primeiro ponto será adicionado

    if (pontoIndex == 0) pontoIndex = 3;  // Se o índice for 0, ajusta para 3

    for (int i = 0; i < tamanho; ++i) {
        printf("%c", buffer[i]);  // Imprime o caractere atual da string

        pontoIndex--;
        if (pontoIndex == 0 && i != tamanho - 1) {
            printf(".");  // Adiciona um ponto a cada três caracteres, exceto no último
            pontoIndex = 3;  // Reinicia o índice para o próximo conjunto de três caracteres
        }
    }

    printf("\n");  // Imprime uma nova linha no final para melhor formatação
}

int main() {
    long long meuNumero = 1968369321;
    formatarNumero(meuNumero);  // Chama a função para formatar e imprimir o número

    return 0;
}
 

  • Curtir 1
Link to comment
Compartilhe em outros sites

  • 4 months later...

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;
}

 

Editado por isrnick
Correção da função que falhava para certos valores inteiros negativos, e expanção de funcionalidade.
  • Curtir 1
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...