Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Settembre 30, 2019, 08:19:44 am

Titolo: [Risolto]Convertire stringa in numero (con decimali)
Inserito da: bonmario - Settembre 30, 2019, 08:19:44 am
Ciao a tutti,
domanda scema del giorno: ho un programma che legge da un file di testo delle stringhe che contengono numeri decimali.
Devo convertire queste stringhe in numeri per poi farci dei calcoli. Purtroppo, alcune stringhe hanno valori come questo '1.5398699999999999E+003'.
Quale funzione devo usare per convertire questi valori ?
So di averlo già fatto in passato, ma non ricordo dove e come !!!

Grazie in anticipo, Mario
Titolo: Re:Convertire stringa in numero (con decimali)
Inserito da: xinyiman - Settembre 30, 2019, 08:43:28 am
Presumo sia un double convertito in formato stringa. Se fosse così basta usare un

StrToFloatDef(stringa, valore di default se non riesco a convertire correttamente)

E poi usi un formatfloat per vederlo come vuoi tu a video. https://www.freepascal.org/docs-html/rtl/sysutils/formatfloat.html
Titolo: Re:[Risolto]Convertire stringa in numero (con decimali)
Inserito da: bonmario - Settembre 30, 2019, 08:51:50 am
Grazie, mi ero perso in una goccia d'acqua ... ho il separatore dei decimali forzato con ',' e quello delle migliaia con '.'
Purtroppo quello era il primo valore letto dal file di testo, e non avevo notato che anche tutti gli altri numeri avevano come separatore dei decimali il punto e non più la virgola.
Mi è bastato impostare quello dei decimali col punto, ed adesso funziona.

Ciao, Mario
Titolo: Re:[Risolto]Convertire stringa in numero (con decimali)
Inserito da: xinyiman - Settembre 30, 2019, 08:53:53 am
Ottimo
Titolo: Re:[Risolto]Convertire stringa in numero (con decimali)
Inserito da: Avogadro - Ottobre 02, 2019, 02:04:22 am
Giusto per : in pascal è sempre esistita (o almeno io la ricordo da sempre) la funzione "val", che ha in input una stringa e ne restitusce il valore numerico

Link
https://www.freepascal.org/docs-html/rtl/system/val.html


Sempre giusto per, in f.p. per c'è anche una funzione analoga  a "prova di errore",  "TryStrToFloat"

link
https://www.freepascal.org/docs-html/rtl/sysutils/trystrtofloat.html

Per la storia dei separatori dei decimali e delle migliaia, ora non ricordo bene, ma mi parte che si possano configurare in automatico alla partenza dell'applicazione ; qui, nel succesivo link, dove descrivono una funzione analoga, "textofloat", c'è un esempio:

https://www.freepascal.org/docs-html/rtl/sysutils/texttofloat.html

Si c'è un po' di ridondanza e alla fine qual'è quella "piu'" giusta ?

Infine, per la lettura di input formattati, come da un file testo di scambio dati,  torna utile la funzione sscanf, che pare sia nata in ambito C
Link C
https://overiq.com/c-programming-101/formatted-input-and-output-in-c/

Link F.P.
https://www.freepascal.org/docs-html/rtl/sysutils/sscanf.html

Non è di uso immediato
https://stackoverflow.com/questions/29584373/why-sscanf-crashes-when-adding-more-variables
Titolo: Re:[Risolto]Convertire stringa in numero (con decimali)
Inserito da: bonmario - Ottobre 02, 2019, 08:08:27 am
Questo era un caso un po' particolare: mi arrivano alcuni files di testo preparati da più uffici.
Solo uno di questi, a partire dall'ultima volta, ha cambiato il separatore dei decimali, gli altri hanno continuato ad usare la virgola.
Io al momento non mi ero accorto di questa cosa, ma avevo solo visto che i numeri erano nel formato "notazione scientifica" (credo si chiami così).
Solo dopo mi sono accorto che tutti i numeri avevano il punto come separatore e non la virgola.
Quindi la soluzione è stata quella di forzare al momento il separatore dei decimali, e ripristinarlo subito dopo.

Ciao, Mario