funkcja konwertująca wstring na double

funkcja konwertująca wstring na double
FR
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
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

Kopiuj
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;
}
edytowany 4x, ostatnio: fryderykst
kq
Moderator C/C++
  • Rejestracja:około 12 lat
  • Ostatnio:18 dni
  • Lokalizacja:Szczecin
4
Kopiuj
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ć?


Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
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.


FR
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
0
kq napisał(a):

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

Kopiuj
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 :)

edytowany 1x, ostatnio: fryderykst
Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

FR
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 lata
1
fryderykst napisał(a):
kq napisał(a):

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

Kopiuj
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

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

I wszystko działa. Dzięki!

edytowany 1x, ostatnio: fryderykst

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.