Página 1 de 2

float com virgula

MensagemEnviado: 12 Nov 2007 13:16
por veioloko
Olá!

estou usando a função sprintf

e colocando %f
para imprimir um numero por exemplo 123.456
So que eu queria que fosse virgula no lugar do ponto
assim
123,456

Como faço?

Sei que tem a função str_replace , mas em microcontroladores não vi.

Obrigado

MensagemEnviado: 12 Nov 2007 16:02
por lrfad2
Boa tarde,

Pensaria em fazer algo assim:
- Definiria o número de casas que queria depois da vírgula;
- multiplicaria o valor requerido por 10 elevado ao número de casas; Ex: 2 casas decimais -> multiplica por 100
- defina um valor máximo que o valor possa chegar;
- ai vc pode fazer uma coisa como a rotina a baixo... não é otimizada, mas acho que deve resolver seu problema;

PS: Não se esqueça de inserir a virgula no array depois de terminada a lógica


unsigned char IntToStr (unsigned int ValorIntToStr)
{
unsigned char li[20];
li = " ";

if ((ValorIntToStr>=10000) && (ValorIntToStr<20000))
{
li = li + '1';
ValorIntToStr = ValorIntToStr - 10000;
}
else if ((ValorIntToStr>=20000) && (ValorIntToStr<30000))
{
li = li + '2';
ValorIntToStr = ValorIntToStr - 20000;
}
else if ((ValorIntToStr>=30000) && (ValorIntToStr<40000))
{
li = li + '3';
ValorIntToStr = ValorIntToStr - 30000;
}
else if ((ValorIntToStr>=40000) && (ValorIntToStr<50000))
{
li = li + '4';
ValorIntToStr = ValorIntToStr - 40000;
}
else if ((ValorIntToStr>=50000) && (ValorIntToStr<60000))
{
li = li + '5';
ValorIntToStr = ValorIntToStr - 50000;
}
else if ((ValorIntToStr>=60000) && (ValorIntToStr<70000))
{
li = li + '6';
ValorIntToStr = ValorIntToStr - 60000;
}
else if ((ValorIntToStr>=70000) && (ValorIntToStr<80000))
{
li = li + '7';
ValorIntToStr = ValorIntToStr - 70000;
}
else if ((ValorIntToStr>=80000) && (ValorIntToStr<90000))
{
li = li + '8';
ValorIntToStr = ValorIntToStr - 80000;
}
else if ((ValorIntToStr>=90000) && (ValorIntToStr<100000))
{
li = li + '9';
ValorIntToStr = ValorIntToStr - 90000;
}


if ((ValorIntToStr>=1000) && (ValorIntToStr<2000))
{
li = li + '1';
ValorIntToStr = ValorIntToStr - 1000;
}
else if ((ValorIntToStr>=2000) && (ValorIntToStr<3000))
{
li = li + '2';
.
.
.

Re: float com virgula

MensagemEnviado: 12 Nov 2007 16:24
por Rodrigo_P_A
eu faria assim:

void main ( void ) {
int i;
char s[20];
float f=1.2345;
sprintf( s, "%f", f ) ;
// Agora troco o ponto pela ,
i=0x00;
while ( s[i]!='0x00' ) {
if ( s[i]=='.' ) s[i]=',';
i++;
}
// pronto, tá do jeito que vc quer a string em s
}

}

MensagemEnviado: 12 Nov 2007 16:32
por tcpipchip
A solucao do PA é melhor :)

MensagemEnviado: 12 Nov 2007 17:32
por Maurício
Use a função: STRPOS, do header STRING.H.

Assim:
Código: Selecionar todos
index = strpos ( string, '.' );
string [ index ] = ',';


[]'s

MensagemEnviado: 12 Nov 2007 17:42
por lrfad2
Como não manjo muito de C, essas funções prontas fazem mô falta.
Valeu pelas dicas.
Vivendo e aprendendo.

MensagemEnviado: 12 Nov 2007 21:15
por msamsoniuk
bom, se vc quiser economizar recursos, vc pode fazer:

float valor = 1.234;
printf("%d,%d\n",(int)valor,(int)(valor*1000)%1000);

se o negocio nao tem fpu, uma opcao melhor seria:

long valor = 1234; /* 1.234 x 1000, faz de cabeca */
printf("%d,%d\n",valor/1000,valor%1000);

e se nao tiver mul/div, o mais eficiente seria:

long valor = 1263; /* 1.234 x 1024, faz na sua HP */
printf("%d,%d\n",valor>>10,valor&1023);

claro q a vantagem de fazer de uma destas formas em relacao a usar sprintf em um buffer vai depender exclusivamente da implementacao.

op

MensagemEnviado: 22 Nov 2007 09:05
por veioloko
Opa!

Valeu pessoal!

Acabei utilizando a rotina do Rodrigo_PA

Pois a função STRPOS não achei no string.h rs...

Ao meu ver foi a mais rapida e mais simples.

Abraços!

Re: op

MensagemEnviado: 22 Nov 2007 11:41
por Rodrigo_P_A
veioloko escreveu:Opa!

Valeu pessoal!

Acabei utilizando a rotina do Rodrigo_PA

Pois a função STRPOS não achei no string.h rs...

Ao meu ver foi a mais rapida e mais simples.

Abraços!


tem funções prontas que não tem no Keil, eu percebi isso tbm.

MensagemEnviado: 22 Nov 2007 13:40
por Maurício
Página 323 do manual C51.pdf.

[]'s

MensagemEnviado: 22 Nov 2007 13:56
por Rodrigo_P_A
Maurício escreveu:Página 323 do manual C51.pdf.

[]'s

Mauricio, no CARM num tem.

MensagemEnviado: 22 Nov 2007 14:33
por Maurício
ah tá!!! ehehehehehe

Agora que eu ví que nós estamos falando de ARM.

I'm.... sorry!! :lol:

[]'s

MensagemEnviado: 23 Nov 2007 22:25
por Maurício
Rodrigo_P_A escreveu:
Maurício escreveu:Página 323 do manual C51.pdf.

[]'s

Mauricio, no CARM num tem.


Ei, P.A!!!

Aqui diz que tem, sim:

http://www.keil.com/support/man/docs/ca/ca_string_h.htm

[]'s

MensagemEnviado: 24 Nov 2007 07:37
por Rodrigo_P_A
eita bixiga, agora nem eu sei mais..... hehehehe... vou testar

MensagemEnviado: 25 Nov 2007 16:43
por veioloko
Eu to usando o real view hueuhuehe nao o carm.
pelo menos o string.h que estou usando não tem essa função.
Mas no fundo ela deve fazer o mesmo que a rotina que o rodrigo passou !