LinuxForum.Fans
Тема

Qt сравнить строки.

Автор: marikk 22 сообщений 3812 просмотров
#369374

Всем привет. Подскажите пожалуйста как можно сравнить два QString. QString содержит числа

Несколько примеров одинаковых


"12 345,04 " = "12345-04" = "12,345.04" = "12345.04" и тд

Предполагаю лучше перевести их в double, но вот как это сделать ?

#369382
"marikk" написал:
Предполагаю лучше перевести их в double, но вот как это сделать ?

https://qt-project.org/forums/viewthread/28958

text
    #include <string>
    #include <cstdlib>
     
    std::string test("0.6");
    double value = ::atof(test.c_str());
#369383
"marikk" написал:
12 345,04

не, ::atof(3) такого не поймёт. Такое только регулярками можно распарсить, увы.

PS: очень НЕ рекомендуется сравнивать на ТОЧНОЕ (не)равенство двух double!!! Опасайтесь ☣.

#369384
"drBatty" написал:
"0.6"

Переводит нормально, но вот 0,6 он уже не принимает.

#369385
"drBatty" написал:
очень НЕ рекомендуется сравнивать на ТОЧНОЕ (не)равенство двух double!!!

Тогда как быть ? Если сравнить их в string невозможно.

#369389
"marikk" написал:
но вот 0,6 он уже не принимает.
конечно. В английской локали точка. AFAIK atof(3) только по-англ. понимает.

"marikk" написал:
Тогда как быть ? Если сравнить их в string невозможно.

вам их всё равно парсить и переводить в нормальный вид: две части,

1. целая.
2. дробная.

сначала надо сравнить №1.

если №1 равны, то сравнивайте №2. Но не прямо, а допишете после более короткого №2 несколько нулей, что-бы части №2 были одинаковой длинны. Например

text
12.123 ? 12.7
12==12
123<700 → 12.123 < 12.7
#369390

Как то так

text

include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main () { int i, n=0; double rezult; char nu[]="12,34.90";

for (i = strlen(nu)-1; i >= 0; i--) { if ( nu[i] >= 48 && nu[i] <= 57) { rezult+=nu[i]-48; rezult/=10; } else { printf ("%f \n", rezult); while (i >= 0) { if (nu[i] >= 48 && nu[i] <= 57) { rezult+=pow(10, n)*(nu[i]-48); n++; } i--; } } }

printf ("%f \n", rezult); }

"drBatty" написал:
1. целая.
2. дробная.
сначала надо сравнить №1.

Такой вариант тоже может быть "12,345.04" и после какого знака начинается дробная часть не определишь.
Поэтому я сначала забрал дробную часть, до первого не числа. Остальные числа идут в целую.
Может как то это можно упростить или улучшить ?

#369391
"marikk" написал:
rezult/=10;

здесь ошибка:

text
x/10*10≠x
#369392

"marikk" написал:
Такой вариант тоже может быть "12,345.04" и после какого знака начинается дробная часть не определишь.
GIGO
#369393

marikk, вам нужно ВСЕГДА умножать на 10. При этом следить, что-бы десятичная точка была на одном месте. Что получается -- сравнивайте. Можно взять uint64_t, этого обычно хватает. Можно даже взять long double, вроде intel обещала, что всё будет точно без деления(и если не выходить за 2⁶⁴)

#369394
"drBatty" написал:
x/10*10≠x

Если оно отрабатывает одинаково, при одинаковом x, разницы при сравнении не будет.

"drBatty" написал:
здесь ошибка:

Тогда как положить последовательность цифр в дробную часть ?

Сравнивать две части по отдельности будет очень тяжко.

#369399
"marikk" написал:
Если оно отрабатывает одинаково, при одинаковом x, разницы при сравнении не будет.
быть может не будет, а может и нет.

"marikk" написал:
Тогда как положить последовательность цифр в дробную часть ?

я же говорю: как целые, только добивайте нулями то число, где цифр после точек меньше. Что бы цифр после точки было одинаково

text
12.123 → 12123
12.7   → 12700
#369401
"drBatty" написал:
я же говорю: как целые,

А как в таком случае быть? "1234,5" и "123,45".

Может лучше сложить в строку нужного формата, в данном случае "xxx.xx" и через atof ?

#369403
text
1234.5 → 123450
123.45 →  12345
#369404

"marikk" написал:
Может лучше сложить в строку нужного формата, в данном случае "xxx.xx" и через atof ?
с некоторыми числами будет работать, с некоторыми не будет.
#369405

да, есть такая strchr(3), которая ищет точку.

#369410

все эти методы есть в QString - replace(), contains()
если у вас дробная часть одинакового размера то
str ="12345.678"
str.replace(QRegExp("[^0-9]"),"");//удалить все кроме цифр
//str = "12345678"
и сравнивайте
ежели разного то дополнить нулями
s1 = "123.4";
s2 ="123.456";
s1 += "00"
//s1 = "123.400"

#369411

"vic5710" написал:
удалить все кроме цифр
вот этого НЕ НУЖНО!

можно так
[console]$ echo "1234.456789"|sed -r 's/$/0000000000/;s/([0-9]*)\.([0-9]{10})0*/\1\2/'
12344567890000
[/console]
на регулярки Qt сами переписывайте, мне лень.
#369412

А в дробной части всегда два знака. Только что уточнил :(

#369416

"marikk" написал:
А в дробной части всегда два знака. Только что уточнил
тогда выкидывайте всё кроме цифр. ессно будет
text
1.5<0.25
Войдите или зарегистрируйтесь, чтобы ответить.