Frage zu wstringstream



  • Hiho,

    ich teste folgender Maßen, ob ein string eine Zahl ist:

    template<typename T>
    inline void isStringANumber(const CStdData::StringType& str,bool& isNumber,CStdData::StringType& errorStr,const wchar_t* errorMsg)
    {
    	T value;
    	std::wstringstream temp;
    
    	temp.str(str);    
    	temp >> value;
    	if (temp.fail())
    	{
    		errorStr += errorMsg;
    		isNumber = false;
    	}
    }
    

    So wenn das T ein int ist und im string ein float steht, dann wandelt der automatisch um und bringt keinen Fehler. ich hätte aber gerne, dass bei T=int Fließkommazhalen im String auch Fehler werfen. Lässt sich das irgendwie am String-Stream einstellen?



  • Wenn du aus einem Stringstream, der ein float enthält, ein int liest, dann wird nur der Teil bis zum Dezimalpunkt gelesen, der Rest verbleibt im Stream. Du kannst das also problemlos mit temp.str().empty() überprüfen.

    Dann noch ein paar Designdinge:

    1. Funktionen in C++ haben nicht umsonst Rückgabewerte. Den bool als Out-Parameter zu übergeben ist unüblich, schwer zu entziffern und sinnlos. Gib den bool einfach als Ergebnis der Funktion zurück.
    2. errorStr und errorMsg sollten vom gleichen Typ sein, wenn du sie eh aneinander hängst.
    3. errorStr und errorMsg haben in der Funktion eigentlich nichts verloren. Die Funktion sollte genau eine Aufgabe haben, und das ist der Test ob es sich bei der Eingabe um eine Zahl handelt. Das Zusammenbasteln einer Fehlermeldung ist eine andere Aufgabe auf einer anderen Abstraktionsebene und sollte an anderer Stelle erfolgen.

Anmelden zum Antworten