Formattazione in valuta

di Alessandro1980m il
9 risposte

Buonasera, sapreste dirmi se esiste una classe in visual c++ o un metodo che prende una stringa di tipo CString e la formatti in valuta… es CString str; str = _T("12345,67") e str diventi = 12.345,67 oppure str = 5000 e diventi str = 5.000,00 

Ho anche provato a creare un metodo, ma senza successo…

Grazie a chi saprà aiutarmi… so che sarebbe molto semplice aggiungere i punti dove serve, ma quando faccio la conversione in double me lo tronca dal primo punto in poi…

9 Risposte

  • No no intendo proprio la classe CString in un progetto MFC di Visual C++ da usare in una Textbox che si controlla con la classe CEdit

  • Usa il metodo Format della CString

  • Il metodo Format consente di formattare una stringa con i decimali, ma non con i punti separatori delle migliaia… o almeno, non ho trovato esempi a riguardo… riesci a postarmene qualcuno? Io ho usato str.Format("%.2lf", cur ) con cur di tipo float, ma non mettere i separatori delle migliaia…

  • La cosa e' “”piu' complicata"".

    1) gli importi monetari NON SI RAPPRESENTANO con i floating point MA con i fixed point (numero di decimali PREDEFINITO 2,4 o 6, dipende dalla moneta)

    2) la rappresentazione in forma di valuta DIPENDE dalla moneta E dalla nazione e NON CENTRA NIENTE con la rappresentazione dei floating point usati per il CALCOLO SCIENTIFICO (e la relativa rappresetazione HA LO STESSO SCOPO)

    Soluzione: implementati una classettina ad hoc.

  • Ah ok quindi a differenza di c# o visual basic non esiste un metodo Format che lo faccia automaticamente  …

  • No, ti stanno dicendo un'altra cosa. Ti stanno dicendo che il tipo “float” non è quello giusto per trattare le valute perché soggetto a problemi di errori di rappresentazione abbastanza rognosi da trattare.

    Dovresti usare un tipo CURRENCY oppure la classe COleCurrency che incapsula il tipo Currency più adatto allo scopo.

    Limitatamente al problema che hai posto invece, un codice che può risolvere è questo (esempio)

    #include <sstream>  
    using namespace std;
    void Test()
    {
       CString s;
       float v = 1234.56;
       ostringstream tmp;
       tmp.imbue(locale(""));
       tmp << v;
       s = tmp.str().c_str();
       MessageBox(NULL,  s, "Test", 0);
    }
  • Grazie!! Però il codice che mi hai fornito non mette i separatori delle migliaia… ho risolto creando una classe ad hoc con tanto di metodi toString() e toFloat() che funziona anche mentre digito un numero in una textbox formattando il valore all'istante e controllando la posizione del cursore 

  • Veramente nel mio PC funziona

    Prova indicando esplicitamente

    tmp.imbue(locale("IT-IT"));

Devi accedere o registrarti per scrivere nel forum
9 risposte