I am reading some data from a database. The data is stored as a currency and I am reading the currency. The data read from the dbase need to be stored in a list control, so I store the data in a CString.
// TODO: was ist, wenn man exponentschreibweise reinmacht in ff Fkt?
// Tausenderzeichen einfügen, falls gewünscht
if(_bTausenderzeichen)
InsertTausenderZeichen(_rstrDoubleString, _CiAnzNachKommaStell);
// =============================================================================
// Methode: BFormat::InsertTausenderZeichen
//
// Beschreibung: Fügt in übergebenen Wert (als String übergeben) Tausendertrenner
// ein. Ist der Wert 0, so wird zB 0,00 erzeugt, je nach übergebener
// Anzahl der Nachkommastellen.
// Hinweis: der Wert 0 ist in allen Varianten erlaubt.
// zB 0.000,0000: wird in 0,00 umgewandelt, wenn _Ci NachkommaStellen = 2.
//
// Parameter: CString &_rstrWert - Wert
// const int _CiNachkommaStellen - Anzahl der Nachkommastellen des
// übergebenen Wertes
//
// Rückgabewert: void
// =============================================================================
void BFormat::InsertTausenderZeichen(CString &_rstrWert, const int _CiNachkommaStellen)
{
// Tausenderzeichen entfernen
_rstrWert.Remove(GetTausenderzeichen());
// '0' ist in allen Varianten erlaubt und diese Funktion kann verlassen werden
if(IsWertNull(_rstrWert))
{
CreateFormattedNull(_rstrWert, _CiNachkommaStellen);
return;
}
// Variablen für Ermittlung des Vorkommateils ohne Vorzeichen
int iStelleTrenner = 0; // Bei Ganzzahlen braucht man keine Stelle für
if(_CiNachkommaStellen > 0) // den Dezimaltrenner
iStelleTrenner = 1; // Bei Fließkommazahlen braucht man 1 Stelle für den Trenner
int iStelleVorzeich = 0; // Vorzeichen, falls vorhanden, braucht 1 Stelle
if(_rstrWert.GetAt(0) == '+' || _rstrWert.GetAt(0) == '-')
iStelleVorzeich = 1;
// Anhand Vorkommastellen, maximale Anzahl der Tausenderpunkte ermitteln
int iVKStellen = _rstrWert.GetLength() - _CiNachkommaStellen - iStelleTrenner - iStelleVorzeich;
unsigned short usMaxAnzPkte;
if(iVKStellen%3 == 0)//"123" hat 3 Stellen und durch 3 ergibt dies 1 Tausenderzeichen, das darf nicht sein!
usMaxAnzPkte = iVKStellen/3 - 1;
else
usMaxAnzPkte = iVKStellen/3;
// Tausenderzeichen neu einfügen
unsigned short usAnzPkte = 0;
for( int i = 0; i < usMaxAnzPkte; ++i)
{
// Hole Vorkommateil des Strings mit Vorzeichen: bei Fliesskommazahlen 1 Stelle
// für den Dezimaltrenner und die Nachkommastellen abziehen
int iAnzVKStellen = _rstrWert.GetLength() - iStelleTrenner - _CiNachkommaStellen;
// Füge Tausenderpunkt ein
_rstrWert.Insert(iAnzVKStellen - ((i+1)*3 + i), GetTausenderzeichen());
++usAnzPkte;
}
}
Try to look up the type for your CDBVariant variable by look at the CDBVariant::m_dwType member.
The following is a description of this type:
m_dwType Union data member
DBVT_NULL No union member is valid for access.
DBVT_BOOL m_boolVal
DBVT_UCHAR m_chVal
DBVT_SHORT m_iVal
DBVT_LONG m_lVal
DBVT_SINGLE m_fltVal
DBVT_DOUBLE m_dblVal
DBVT_DATE m_pdate
DBVT_STRING m_pstring
DBVT_BINARY m_pbinary
If you are attempting to access the m_dblVal member, and it is not a DBVT_DOUBLE type, that would be a clue as to why the following doesn't work:
Can you let us know what type it is returning? Also, have you tried to use the strtod function as suggested by ergas to convert your string value to a double?
There is also a CURRENCY datatype in vc++.
This is correct way to read currency from database and to convert it to string. If you need other locale then user default, take a look on parameters for COleCurrency::Format();
This is correct way to read currency from database and to convert it to string. If you need other locale then user default, take a look on parameters for COleCurrency::Format();
Unfortunaly the CRecordSet::GetFieldValue() does not take a COleVariant object as a param. If I am not wrong this will only work if you use the class CDaoRecordset.
Bookmarks