2009-07-03 14 views
6

Tener:..Formateo de un flotador a ### ## (dos decimales)

var 
Difference: DWORD // difference shows in milliseconds 
// List.Items.Count can be any 0 to ######## 
[...] 
sb.panels[2].Text := FloatToStr((((List.Items.Count)/difference)/1000)); 

quiero formatear el texto resultante a cualquier ### ## (dos decimales). Usar FloatToStrF no es exitoso (parece que no funciona con DWORD).

Gracias

Respuesta

5

preguntando si esto es un problema con las matemáticas en lugar de formato. ¿Por qué estás dividiendo el número de elementos por 1000? ¿Quiere dividir milisegundos (su variable Diferencia) por 1000? Tal vez esto es lo que quiere:

EventRate := (List.Items.Count)/(difference/1000); // events per second; to make it per minute, need to change 1000 to 60000 

Por supuesto, igual querrá formatear el resultado. Lo necesitará como una propiedad variable o de clase:

MyFormatSettings: tformatsettings; 

luego, tendrá que hacer esto una vez, p. en FormShow:

getlocaleformatsettings(locale_system_default, MyFormatSettings); 

finalmente, esto debería funcionar:

sb.panels[2].Text := format('%5.2f', EventRate, MyFormatSettings); 
+0

Si el OP desea mostrar el tiempo necesario para procesar un elemento de la lista, ¿no debería ser algo así como: "SomeFloat: = 0.001 * (diferencia/List.Items.Count); " ¿en lugar? Por supuesto, 0 artículos deben manejarse antes ... – mghie

+0

Sí, sí tengo que dividir. EventPerMinute: = List.Items.Count/difference/1000; Algunas soluciones: sb.panels [2] .Text: = floattostr (eventperminute); // OK pero no formateado sb.panels [2] .Text: = floattostrF (EventPerMinute, ffNumber, 4,3); // siempre 0 sb.panels [2] .Text: = Formato ('% f', [eventperminute]); // siempre 0 sb.panels [2] .Text: = FormatFloat ('#, ## 0', EventPerMinute); // siempre 0 --------------- Este cálculo se realiza en un evento Timer, que se dispara cada 1000 ms. – volvox

+0

si hay 10 elementos de la lista en 5000 milisegundos, entonces 10/5000/1000 arrojará 0.000002 - ¡no es de extrañar que obtenga cero! Incluso si haces lo que sugiero, 10/(5000/1000) = 2 esto está en eventos POR SEGUNDO no por minuto. ¡Por minuto, tendrías que dividir por 60000! – Argalatyr

9

¿Por qué no utilizar la función de formato con format strings? Ejemplo:

sb.panels[2].Text := Format('%8.2f',[123.456]); 

Otras funciones serían

function FormatFloat(const Format: string; Value: Extended): string; overload; 
function FormatFloat(const Format: string; Value: Extended; const FormatSettings: TFormatSettings): string; overload; 
+0

ya he probar todas esas soluciones .. ejemplo: sb.panels [2] .Texto: = FormatFloat ('#, # # 0 ', ((List.Items.Count)/difference)/1000); El resultado es siempre 0. ¿Qué pasa con la versión de sobrecarga? ¿Tienes un ejemplo usándolo? – volvox

+0

Quizás en sus locales el, significa el delimitador de 1k y debería usar. en lugar. –

+0

Gracias por la información, apreciada. Mi problema ahora está resuelto. – volvox

Cuestiones relacionadas