Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: antoniog - Aprile 23, 2018, 10:09:04 am

Titolo: STRINGA IN NUMERO (RISOLTO)
Inserito da: antoniog - Aprile 23, 2018, 10:09:04 am

Linux Mint 18 Mate - Lazarus 1.6.4 - Zeosdbo 7.1.4 - tabelle sqlite

Devo calcolare il totale di  un'espressione numerica contenuta in un campo memo la procedura che ho utilizzato fino ad ora ha sempre funzionato correttamente, questo è il codice :
Codice: [Seleziona]
    DataProge.ZQuery1.Active := False;
    DataProge.ZQuery1.DataSource := DataProge.DMisure;
    DataProge.ZQuery1.SQL.Text := 'SELECT ' + DBMmis.Text + ' FROM Misure;';
    DataProge.ZQuery1.Active := True;
    DataProge.Misure.Edit;
    DataProge.MisureProdotto.Value := DataProge.ZQuery1.Fields[0].AsFloat;
    DataProge.Misure.Post;
DBMmis.Text è un'espressione numerica tipo questa: 125.30*((2.15+6.50)/2)
DataProge.MisureProdotto.Value è il campo Real che ospita il Totale dell'espressione in questo caso 541,9225
Il separatore decimale è un punto e non una virgola.
Per avere la restituzione dei numeri col formato regionale ho inserito la unit "clocale" nella clausola uses del programma principale con questa istruzione {$ifdef unix}clocale{$endif} e mi  viene restituito questo errore:

"541.9225" is an invalid float. Se sostituisco i separatori decimali con virgole, l'espressione non viene calcolata ma viene restituita la parte intera del primo numero, in questo caso '125'
Togliendo la unit 'clocale ' il numero restituito è corretto ma la visualizzazione di date e numeri NO.
Cosa posso fare per avere entrambe le funzioni?
Titolo: Re:STRINGA IN NUMERO
Inserito da: xinyiman - Aprile 23, 2018, 10:26:33 am
Onestamente se il risultato è giusto, ma non ti piace il formato del risultato io opterei per questa soluzione

https://www.freepascal.org/docs-html/rtl/sysutils/formatfloat.html
Titolo: Re:STRINGA IN NUMERO
Inserito da: antoniog - Aprile 23, 2018, 03:15:56 pm
non voglio perdere la formattazione regionale di data -dd/mm/yyyy- e numeri -000.000,00-
ho risolto così, nella form principale:
Uses SysUtils, clocale .........


all'apertura della form dove devo effettuare le conversioni :

procedure TPrMisureF.FormActivate(Sender: TObject);

begin
   DecimalSeparator:='.';
end;

alla chiusura della form :

procedure TPrMisureF.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  DecimalSeparator:=',';
end;