Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [delphi] prendere solo una parte di un numero

    Come da titolo...

    ho un numero che può, ad esempio, essere 2452566,66586.
    Mi interessa solo 0,66586. Come faccio?

    (si vede che sono ancora alle prime armi, eh? )

    In più...è possibile sostituire il punto con la virgola?

    bye

    Τί ουν ποιήσε ϕιλοσοϕίας πέρι; πή τρέψή άγνοουμένων τούτων;

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Puoi ottenere la parte intera o decimale di un valore in virgola mobile usando le funzioni Int e Frac.

    Eccoti un esempio puramente indicativo:
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      n, i, f: Double;
    begin
      n := 2452566.66586;
      i := Int(n);
      f := Frac(n);
    end;
    In questo codice, la variabile i assume il valore 2452566, mentre la variabile f assume il valore 66586.

    Occorre notare che si tratta sempre di valori in virgola mobile, sebbene il primo sia costituito dalla parte intera del valore originale, mentre il secondo dalla parte frazionaria (a destra della virgola).

    Va da sè che, se devi ottenere tali valori partendo da un testo (quindi una stringa), prima devi effettuare la conversione in valore a virgola mobile usando la funzione StrToFloat.

    Per convertire correttamente la stringa, il separatore decimale utilizzato deve essere valido e questo dipende dal sistema in cui ti trovi. La variabile DecimalSeparator contiene il carattere valido come separatore decimale, quindi puoi sostituire punto o virgola col separatore sicuramente corretto in un modo simile a questo:
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      n, i, f: Double;
      s: string;
      c: Integer;
    begin
      s := Edit1.Text;
      for c := 1 to Length(s) do
        if s[c] in ['.', ','] then
          s[c] := DecimalSeparator;
      n := StrToFloat(s);
      i := Int(n);
      f := Frac(n);
    end;
    Il valore decimale inserito nella casella di testo Edit1 viene memorizzato in una variabile stringa locale; facendo la scansione della stringa, ogni carattere che corrisponda ad un punto (.) o ad una virgola (,) viene sostituito col separatore "ufficiale" dei decimali (probabilmente risulterà essere uno dei due).
    Quando la stringa è pronta, viene convertita in un effettivo valore a virgola mobile, di cui vengono prese le parti intera e decimale per sottoporle ad ulteriori elaborazioni.

    Un avvertimento: il modo in cui la CPU tratta i decimali può fare in modo che un valore scritto come 0,45 venga successivamente elaborato come qualcosa del tipo 0,4999999999999....

    Spero di averti dato sufficienti indicazioni.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Il dato è in un variant per motivi che non sto qui a spiegarti.
    penso che non ci sia bisogno di alcuna conversione, no?

    (grazie 1000, sei stato chiarissimo )

    Τί ουν ποιήσε ϕιλοσοϕίας πέρι; πή τρέψή άγνοουμένων τούτων;

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Una variabile Variant è in grado di mutare il proprio tipo di dato in base al valore che le viene assegnato.

    Pertanto, non c'è bisogno di alcuna conversione se il tipo di dato è realmente un valore in virgola mobile e non, ad esempio, una stringa che contiene tale valore sottoforma di caratteri.

    Inoltre, non tutte le funzioni accettano dei Variant, quindi ove possibile effettuerei un assegnamento ad una variabile del tipo appropriato.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.