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

    [delphi] formattare valori numeri in importo

    ciao ragazzi

    scusate ma ecco un'altro problema.

    leggo sempre da file di testo vari formati di importo es:
    2,000.00(virgola migliaia, punto decimale)
    2.000,00(punto migliaia, virgola decimale)
    2000 (nessuno)

    la mia funzione deve ritornate un formato unico es. (2000.00)
    il campo e di tipo double( Access).

    es:
    formattaimporto(S:stringa)

    saluti e grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da rafpas
    leggo sempre da file di testo vari formati di importo es:
    2,000.00(virgola migliaia, punto decimale)
    2.000,00(punto migliaia, virgola decimale)
    2000 (nessuno)

    la mia funzione deve ritornate un formato unico es. (2000.00)
    il campo e di tipo double( Access).
    Qual è il problema effettivo? Cosa non riesci a fare?
    Ad ogni modo, spero che gli importi di cui parli non siano di formato diverso all'interno dello stesso file...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    gli importi sono di formato diverso letti dai file..

    e posso essere nei casi dei formati citati....

    a me serve convertirli nel formato 2000.00 quello che accetta Access
    come tipo double.....

    la funzione deve accetta come parametro un stringa nel formato letto
    e deve ritornare un double es 2000.00

    e non come impostare la funzione

    credo che sia stao chiaro altrimenti mi fai sapere

    grazie

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    A seconda del formato, ti basterebbe sostituire con la funzione AnsiReplaceStr
    i caratteri separatori dei decimali e delle migliaia con le variabili DecimalSeparator e ThousandSeparator che contengono appunto detti separatori ma validi per Delphi ai fini della conversione in valore intero attraverso la funzione StrToFloat o StrToCurr.

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

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

  5. #5
    scusami alka se insisto

    ho capito il tuo suggerimento, pero vorrei sapere come fare
    a riconoscere il formato della stringa....

    se gli passo alla mia funzione es 2,000.00, 2.000,00, 800,00, 800.00,
    16000, ecc...

    avevo incominciato a fare cosi:
    function puliscipunto(S:string):string;
    var p: string;
    begin
    if (pos('.',S)>0) then //PMVD
    begin
    p := AnsiReplaceStr(S, ',', '.');
    delete(p,Pos('.', p),1);
    result := p;
    end;

    // p := floattostr(strtofloat(s)/100);
    // result := p;
    end;

    pero mi sono perso
    grazie

  6. #6
    nessuno puo darmi una dritta
    grazie

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da rafpas
    ho capito il tuo suggerimento, pero vorrei sapere come fare
    a riconoscere il formato della stringa....
    Più che altro, non ho ben chiaro la sequenza dei passi da compiere.

    Innanzitutto, mi pare che tu debba rimuovere tutti i caratteri che indicano le migliaia, no?

    In tal caso, se si tratta di un punto, ti è sufficiente imbastire un ciclo while eseguendolo fino a quando la funzione Pos usata per individuare la posizione del carattere "punto" (.) non ti restituisce zero.

    Se invece ti restituisce una posizione, devi provvedere a rimuovere dalla stringa il punto in quella posizione.

    Quando hai ripulito interamente la stringa, puoi passare alla sostituzione di punti e virgole con i caratteri necessari.

    Sinceramente, dato che devi inserire quei valori in Access, non vedo perchè agire così pesantemente sulle stringhe.

    Mi spiego: attraverso le variabili DecimalSeparator e ThousandSeparator, Delphi sa come deve interpretare valori numerici in virgola mobile per convertirli da stringa.

    A questo punto, se i tuoi valori seguono le convenzioni stabilite dalle variabili sopraindicate, cioè usano i caratteri contenuto nelle due variabili come separatori di migliaia e decimali, puoi convertire direttamente il testo in valore effettivo a virgola mobile usando la funzione StrToFloat.

    Invece, se hai valori che usano diverse convenzioni per separare decimali e migliaia, allora Delphi non potrà convertirli e quindi dovrai provvedere a sostituire i caratteri di separazione di decimali e migliaia con quelli definiti dalle variabili ThousandSeparator e DecimalSeparator di Delphi, in modo da poter convertire anche essi attraverso la funzione StrToFloat.

    Ciò che la tua funzione dovrà restituire, in sostanza, è un valore float (Double) che contiene il valore a virgola mobile ottenuto dalla conversione del testo passato come parametro; tale testo potrà essere convertito direttamente se è nel formato comprensibile a Delphi, con i giusti caratteri di separazione di migliaia e decimali, oppure - magari in base ad un appropriato parametro esterno che indica se effettuare o no la correzione - dovrà sostituire i caratteri probabilmente invertiti con quelli sempre attesi da Delphi, usando la funzione AnsiReplaceStr già presentata.

    Alla fine, usando StrToFloat si converte il testo, già pronto o corretto, nel corrispondente valore numerico da inserire nella tabella di Access o in una query o altro.

    Spero di averti spiegato bene il meccanismo di funzionamento...al codice, prova a pensarci tu.

    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.