Надеюсь, что помог.
Код: Выделить всё
bool is_digit(wchar_t c)
{
return c >= L'0' && c <= L'9';
}
// converts inStr into float. returns float value. length at out is length of float string. point - decimal point character
float w_to_f(const wchar_t* inStr, int* length = NULL, const wchar_t point = L',')
{
const wchar_t* str = inStr;
float value = 0.f;
for (; *str && *str != point && is_digit(*str); ++str)
value = value * 10.f + (*str - L'0');
if (*str == point)
++str;
for (float multiplier = 0.1f; *str && is_digit(*str); ++str, multiplier *= 0.1f)
value += multiplier * (*str - L'0');
if (length)
*length = str - inStr;
return value;
}
// result is the same as strcmp has
int compare_str_with_float(const wchar_t* str1, const wchar_t* str2, const wchar_t point = L',')
{
while (*str1 && *str2)
{
float chr1;
bool chr1float;
if (is_digit(*str1))
{
int length;
chr1 = w_to_f(str1, &length);
chr1float = true;
str1 += length;
}
else
{
chr1 = *str1;
chr1float = false;
++str1;
}
float chr2;
bool chr2float;
if (is_digit(*str2))
{
int length;
chr2 = w_to_f(str2, &length);
chr2float = true;
str2 += length;
}
else
{
chr2 = *str2;
chr2float = false;
++str2;
}
if (chr1float != chr2float)
return chr1float ? -1 : 1;
else
if (chr1 < chr2)
return -1;
else if (chr1 > chr2)
return 1;
}
return 0;
}