Página 1 de 2
float com virgula

Enviado:
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

Enviado:
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

Enviado:
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
}
}

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


Enviado:
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

Enviado:
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.

Enviado:
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

Enviado:
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

Enviado:
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.

Enviado:
22 Nov 2007 13:40
por Maurício
Página 323 do manual C51.pdf.
[]'s

Enviado:
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.

Enviado:
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!!
[]'s

Enviado:
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

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

Enviado:
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 !