Ir ao conteúdo

Posts recomendados

Postado

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 costumaos usar aqui no Brasil. Obrigado desde já!

Separar milhres.jpg

  • Obrigado 1
Postado
10 horas atrás, Alexandre C. Barbosa disse:

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)

 A julgar pela imagem da execução os números não são "retornados para o sistema operacional" mas sim enviados para a saída padrão, stdout em C. E está usando um programa de console. Em Windows o recomendado desde 2019 é usar o Terminal porque é mais flexível, aceita Unicode e é muito muito mais rápido porque usa aceleração gráfica por hardware. O console é obsoleto desde então.

 

10 horas atrás, Alexandre C. Barbosa disse:

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

 

Talvez pudesse postar alguns desses jeitos todos de modo a alguém poder ajudar. 

 

De todo modo C não tem algo razoável pra fazer isso. Como nenhuma dessas linguagens desse forum. Ou java, ou Pascal ou python ou sei lá. E se o valor for dinheiro muito menos. De memória apenas COBOL tem isso muito bem feito. Mas se pode imitar. Pesquise pela cláusula PICTURE em COBOL, e como eram os especificadores. E simplesmente escreva algo igual em C para usar no printf...

 

Algo assim

 

		char* meuNumero(long long const valor, const char* espec);

 

E simplesmente use isso no printf.

 

Vou deixar um exemplo C no fim.

 

Em COBOL se usa como especificador uma sequência de letras, com um sentido específico. Algo assim:

  • 9 quer dizer um número. e pronto.
  • Z quer dizer um número, opcional se não for preciso, como um zero a esquerda
  • "," quer dizer o separador de milhares. E você deve consultar usando locale.h e não mudar no sistema porque a máquina que roda o programa pode não ser sua
  • "." é o ponto decimal
  • $ é o símbolo do dinheiro

EX: 

    $ZZZ,ZZZ,ZZZ,ZZ9.99 seria o especificador para dinheiro e para o valor do exemplo 1968369321 iria mostrar
    R$ 19.683.693,21 se seu sistema usar vírgula como separador decimal.

 

Mas se o valor fosse 98 iria mostrar R$ 0,98 porque o Z é opcional e o 9 é obrigatório.

 

Dá certo desde os anos 60 ou as contas de luz e telefone e água jamais teriam saído direito, por exemplo. Nem os extratos do banco.

 

Apenas copie

 

Eis um programa exemplo

 

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

char* meuNumero(long long const valor, const char* espec);

int main(void) {
  const long long teste = 1968369321;
  char* saida = meuNumero(teste, "especificador");
  if (saida == NULL) {
    printf("não consegui formatar!\n");
    return -1;
  }
  printf("De %llu para \"%s\"\n", teste, saida);
  free(saida);
  return 0;
}

char* meuNumero(
    long long const valor,
    const char* espec)
{
  char* exemplo = "[exemplo]";
  char* st = (char*) malloc(1 + strlen(exemplo));
  if (st == NULL) return NULL;  // exemplo de erro
  strcpy(st, exemplo);
  return st;  // exemplo ok
}

 

Que mostra

 

De 1968369321 para "[exemplo]"

 

  • Obrigado 1
Postado

@Felipecfk Essas soluções não convivem bem com locale.h e pode ser melhor nem considerar. Em '23 MSVC não compila com esse especificador --- apostrofe --- a menos de alguma obscura opção de compilação. O compilador gcc 10 por exemplo compila sem erros ou avisos mas nada faz se o locale for pt-BR, e deve ser por causa do valor de LC_NUMERIC.

 

Assim fica muito frágil e deve levar a problemas com acentos por exemplo. Fiquei curioso em ver como outras linguagens implementam isso nos últimos tempos, fui pesquisar na documentação e parece que todos vão nesse caminho mesmo de trabalhar a entrada usando um especificador como o PICTURE do COBOL. Sem surpresas porque vem sendo usado desde os 60.

 

Sugiro mesmo usar uma função com um especificador como no programa que mostrei, porque não interfere com locale e com acentos e é mais simples de manter. Se hoje bastar colocar o separador de milhares amanhã pode ser preciso usar um sinal mesmo que positivo, pode ser preciso usar o sinal como sufixo, podem vir zeros a esquerda ou ter espaços mandatórios como no caso de 1 ficar 0,01 para um centavo.

 

 

 

 

 

 

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...