[Code Snippet] getFloatFromString [C++

02/15/2012 13:21 NikM#1
I wrote a small function for getting a float from a string.
I know that this function isn't perfect.
It isnt very hard to fix it ;)
I belive in you guys :P

Code:
using namespace std;

float getFloatFromString (char *szBuffer);

int main ()
{
	float fCount = getFloatFromString ("Ich wasche meinen Hans Günter jeden Tag 2412.1234");

	printf ("%.4f\n", fCount);

	getchar ();
	return (0);
}

float getFloatFromString (char *szBuffer)
{
	float fGewicht = 0.0f;
	float fOperator = 1.0f;
	int iTemp = 0;
	int iCounter = 0;

	while (*szBuffer != 0 && *szBuffer != '.')
	{
		if ((*szBuffer >= '0' && *szBuffer <= '9'))
			fOperator /= 10.0f;
		
		szBuffer ++;
		iCounter ++;
	}

	szBuffer -= iCounter;

	for ( ; *szBuffer != 0 ; szBuffer++)
	{
		if ((*szBuffer >= '0' && *szBuffer <= '9'))
		{
			fOperator *= 10.0f;
			iTemp = (int)(*szBuffer) - 48;
			fGewicht += (float)(iTemp / fOperator);
		}
	}

	return (fGewicht);
}
Have fun ;)

Credits: NikM
02/15/2012 14:03 käsekuchen11elf#2
Netter Code, ich würde aber nicht empfehlen, in diesem Fall das Rad neu zu erfinden.

Unter C bieten sich die Funktion der strtod() Familie an (siehe [Only registered and activated users can see links. Click Here To Register...])

und unter C++ würde man eher einen std::stringstream verwenden, oder falls man C mag / errno verwenden möchte / mit char arrays arbeitet, auch strtod().

hier ein std::stringstream Beispiel:
Code:
#include <sstream>
#include <iostream>

int main()
{
  std::string foo("3.141592");
  std::stringstream s(foo);

  float f;
  s >> f;

  std::cout << f << std::endl;
  return 0;
}
Das ist eleganter und vermutlich auch effizienter als eine eigene Implementierung :)

Grüße,
cheesecake
02/15/2012 15:44 Nightblizard#3
This would be even better:
Code:
template<typename _TO, typename _FROM>
_TO ConvertTo(_FROM val)
{
	_TO retValue;
	std::stringstream ss;
	ss << val;
	ss >> retValue;
	return retValue;
}
allows you:

Code:
double foo = 1.23;
int bar = ConvertTo<int>(foo);
std::string str = ConvertTo<std::string>(bar);
Edit:
Oh, this guy speaks english! Sorry, I'll translate my posting!

@SkyneT:
Oh, haven't seen that! Well spotted!
02/15/2012 16:23 .SkyneT.#4
Code:
	system ("pause");
... Dont use that !

Use this:
Code:
	std::cin.get();
or:
Code:
	getchar();
02/15/2012 22:05 NikM#5
Meine Muttersprache ist Deutsch ^^
Ihr könnt also ebenso gerne auf Deutsch anworten :P

@Nightblizard
Deine Methode mit der Template gefällt mir :)

@.SkyneT.
Why not :O
02/15/2012 22:17 Nightblizard#6
Darum: [Only registered and activated users can see links. Click Here To Register...]

Der Aufwand/Nutzen Faktor ist viel zu gering.