Die privaten Member-Funktionen DoubleToString, CStringToDouble und StripEndingZero dienen der Umwandlung von m_dValue in m_strValue und umgekehrt. Die Routinen führen die Konvertierung eleganterweise nicht selber aus, sondern delegieren diese Arbeit an die Klassen std::istringstream bzw. std::ostringstream weiter, allerdings unter Berücksichtigung der Einheit.
double CHertzEdit::CStringToDouble(CString &str){ double d;
if (((m_bNegativAllowed==FALSE) && (str.FindOneOf("-") != -1)) || (str.CompareNoCase("invalid") == 0)) { d=-1.0; } else { // String in Stream kopieren int i=str.GetLength(); std::istringstream ist(str.GetBuffer(i)); str.ReleaseBuffer();
double d1; char c[3];
// Wert und Einheit trennen ist >> d1 >> c; CString strEinheit(c);
// Wert anhand der Einheit anpassen if (!strEinheit.CompareNoCase("Hz")) { d=d1; } else if (!strEinheit.CompareNoCase("kHz")) { d=d1*1000.0; } else if (!strEinheit.CompareNoCase("MHz")) { d=d1*1000000.0; } } return(d);}
std::string CHertzEdit::DoubleToString(double d){ double d1, d2;
std::ostringstream ost; ost.setf(std::ios_base::fixed, std::ios_base::floatfield);
d2=fabs(d);
if (d < 0.0 && !m_bNegativAllowed) { ost << "Invalid" << std::ends; } else if (d2 < 1000.0) // Hz-Bereich { d1 = d; ost << std::setprecision(1); ost << d1; StripEndingZero(ost); ost << " Hz" << std::ends; } else if (d2 < 1000000.0) // Khz-Bereich { d1 = d / 1000.0; ost << std::setprecision(4); ost << d1; StripEndingZero(ost); ost << " KHz" << std::ends; } else if (d2 > 10.0e9) // zu gro? fuer format::fixed { ost << "Invalid" << std::ends; } else // MHz-Bereich { d1 = d / 1000000.0; ost << std::setprecision(7); ost << d1; StripEndingZero(ost); ost << " MHz" << std::ends; } return(ost.str());
}
void CHertzEdit::StripEndingZero(std::ostringstream &oststr){ std::string strString= oststr.str(); std::string::iterator it = strString.end(); --it;
// Letztes Zeichen == '0' ? while ( *(it) == '0' && it != strString.begin()) { // ja // ist davor der '.' ? if ( *(it-1) != '.') { // nein => weg damit strString.erase(it); it = strString.end(); --it; } else { // ja => '0' dranlassen (z.B. 1.0) break; } } // nein => nichts machen // oststr neu initialisieren oststr.seekp(0); oststr << strString;}