funkcja konwertująca wstring na double

0

Wiem, że jest funkcja w standardzie, stod(czy jakoś tak), ale u mnie w wstring jest przecinek zamiast kropki i tamta funkcja sobie nie radzi.
W każdym razie, to akurat mało ważne., Dlaczego ta funkcja nie działa? Funkcję przepisywałem zmieniając nazwy zmiennych i trochę ją poprawiając, więc duże prawdopodobieństwo, że coś skopałem przepisując. Ale nie mogę się doszukać.

Dostaję błąd: Debug Assertion Failed! Expression: string subscript out of rang

double A::B::WstringToDouble(const wstring & wString)
{
	size_t wStringSize = wString.size();
	for (size_t i = 0;i < wStringSize;++i)
		if ((wString[i] >= 48 && wString[i] <= 57) || wString[i] == 44 || wString[i] == 45)
			continue;
		else
			return DBL_MAX;

	double wDouble = 0;
	bool wNegative = false;
	int wCommaIndex = 0;
	for (size_t i = 0;i < wStringSize;++i)
	{
		if (wString[i] == 44)
			wCommaIndex = i;
	}
	//przed przecinkiem
	for (size_t i = wCommaIndex;i >= 0;--i)////////////<-TUTAJ Po 3cim przejściu pętli zmienna *i* dostaje kosmiczną wartość.
	{
		if (wString[i] == 45)
			wNegative = true;
		if (wString[i] <= 57 && wString[i] >= 48)
		{
			wDouble = wDouble + ((int(wString[i]) - 48) * (pow(10, (wCommaIndex - i - 1))));
		}
	}
	//po przecinku
	for (size_t i = wCommaIndex; i <= wStringSize; ++i)
	{
		if (wString[i] <= 57 && wString[i] >= 48)
		{
			wDouble = wDouble + ((int(wString[i]) - 48) * (pow(10, (wCommaIndex - i))));
		}
	}
	if (wNegative)
		wDouble = -wDouble;
	return wDouble;
}
4
for (size_t i = wCommaIndex;i >= 0;--i)

i jest nieujemne (unsigned). i >= 0 jest zawsze prawdziwe.

Nie używaj magicznych liczb. Dużo czytelniej użyć L'0' niż 48.

Dlaczego gdy wykryjesz niepoprawny input zwracasz DBL_MAX zamiast NaN?

Ogólnie, nie łatwiej zmienić locale/, na . zamiast się tak nieziemsko męczyć?

2

ale u mnie w wstring jest przecinek zamiast kropki i tamta funkcja sobie nie radzi.

A nie możesz po prostu zamienić przecinka na kropkę i wywołać to strtod? :P
Abstrahując od tego, iż istnieją lepsze sposoby na konwersję...

TUTAJ Po 3cim przejściu pętli zmienna i dostaje kosmiczną wartość.

Dam Ci podpowiedź: size_t jest typem bezznakowym.

0
kq napisał(a):

Ogólnie, nie łatwiej zmienić locale/, na . zamiast się tak nieziemsko męczyć?
Mam ustawione

setlocale(LC_CTYPE, "");

i jakoś nie daje to rady, chyba że wstawić "plPL"(czy coś w ten deseń), dzięki za informację!

Patryk27 napisał(a):

A nie możesz po prostu zamienić przecinka na kropkę i wywołać to strtod? :P
Abstrahując od tego, iż istnieją lepsze sposoby na konwersję...

No jakoś nie przyszło mi to do głowy :D
Jakie na przykład?

Przynajmniej dowiedziałem się ciekawych rzeczy, nic nie poszło na marne :)

1
fryderykst napisał(a):
kq napisał(a):

Ogólnie, nie łatwiej zmienić locale/, na . zamiast się tak nieziemsko męczyć?
Mam ustawione

setlocale(LC_CTYPE, "");

i jakoś nie daje to rady, chyba że wstawić "plPL"(czy coś w ten deseń), dzięki za informację!

"Mądry" ja, przecież to nie jest sprawa LC_CTYPE, a LC_NUMERIC

setlocale(LC_NUMERIC, "");
std::stod(wstring);

I wszystko działa. Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1