2009-07-03 20 views
6

Avere:..formattazione di un galleggiante a ### ## (due decimali)

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

voglio formattare il testo risultante a qualsiasi ### ## (due decimali). L'utilizzo di FloatToStrF non ha esito positivo (non sembra funzionare con DWORD).

Grazie

risposta

5

chiedo solo se questo è un problema con la matematica piuttosto che la formattazione. Perché stai dividendo il numero di articoli per 1000? Intendi dividere i millisecondi (la tua differenza Differenza) per 1000? Forse questo è quello che vuoi:

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

Naturalmente, vorrai comunque formattare il risultato. Avrete bisogno di questo come una proprietà variabile o classe:

MyFormatSettings: tformatsettings; 

poi, avrete bisogno di farlo una volta, ad esempio, in FormShow:

getlocaleformatsettings(locale_system_default, MyFormatSettings); 

infine, questo dovrebbe funzionare:

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

Se l'OP vuole mostrare il tempo necessario per elaborare un elemento dell'elenco, non dovrebbe essere qualcosa del tipo: "Some Flo: = 0.001 * (differenza/List.Items.Count); " anziché? Ovviamente 0 articoli devono essere gestiti prima ... – mghie

+0

Sì, devo dividere. EventPerMinute: = List.Items.Count/difference/1000; Alcune soluzioni: sb.panels [2] .Text: = floattostr (eventeperminute); // OK ma non formattato sb.panels [2] .Text: = floattostrF (EventPerMinute, ffNumber, 4,3); // sempre 0 sb.panels [2] .Text: = Formato ('% f', [eventperminute]); // sempre 0 sb.panels [2] .Text: = FormatFloat ('#, ## 0', EventPerMinute); // sempre 0 --------------- Questo calcolo è su un evento Timer, attivato ogni 1000 ms. – volvox

+0

se ci sono 10 voci di lista in 5000 millisecondi, quindi 10/5000/1000 produrrà 0,000002 - non c'è da meravigliarsi se si ottiene zero! Anche se fai come suggerisco, 10/(5000/1000) = 2 questo è negli eventi PER SECONDO non al minuto. Per minuto, dovresti dividere per 60000! – Argalatyr

9

Perché non si utilizza la funzione di formattazione con format strings? Esempio:

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

Funzioni sarebbero

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

Ho già provare tutte quelle soluzioni .. Esempio: sb.panels [2] .Text: = FormatFloat ('#, # # 0 ', ((List.Items.Count)/difference)/1000); Il risultato è sempre 0. Che dire della versione di sovraccarico? Hai un esempio che lo usa? – volvox

+0

Forse nella tua gente del posto, indica il delimitatore 1k e dovresti usarlo. anziché. –

+0

Grazie per l'informazione, apprezzata. Il mio problema è ora risolto. – volvox

Problemi correlati