Всем привет. Подскажите пожалуйста как можно сравнить два QString. QString содержит числа
Несколько примеров одинаковых
"12 345,04 " = "12345-04" = "12,345.04" = "12345.04" и тд
Предполагаю лучше перевести их в double, но вот как это сделать ?
Настоятельно просим вас при общении соблюдать Правила форума и законы РФ. Наша тематика вне политики, поэтому воздержитесь от обсуждения ситуации на Украине и связанных с ней событий, независимо от того, какую сторону вы поддерживаете.
Также напоминаем, что наш форум находится в доменной зоне .ru, физически расположен на российских серверах и мы соблюдаем действующее законодательство России. Любые сообщения о политике будут удаляться.
Linux Forum → Программирование → Qt сравнить строки.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Всем привет. Подскажите пожалуйста как можно сравнить два QString. QString содержит числа
Несколько примеров одинаковых
"12 345,04 " = "12345-04" = "12,345.04" = "12345.04" и тд
Предполагаю лучше перевести их в double, но вот как это сделать ?
Предполагаю лучше перевести их в double, но вот как это сделать ?
https://qt-project.org/forums/viewthread/28958
#include <string>
#include <cstdlib>
std::string test("0.6");
double value = ::atof(test.c_str());12 345,04
не, ::atof(3) такого не поймёт. Такое только регулярками можно распарсить, увы.
PS: очень НЕ рекомендуется сравнивать на ТОЧНОЕ (не)равенство двух double!!! Опасайтесь ☣.
"0.6"
Переводит нормально, но вот 0,6 он уже не принимает.
очень НЕ рекомендуется сравнивать на ТОЧНОЕ (не)равенство двух double!!!
Тогда как быть ? Если сравнить их в string невозможно.
но вот 0,6 он уже не принимает.
конечно. В английской локали точка. AFAIK atof(3) только по-англ. понимает.
Тогда как быть ? Если сравнить их в string невозможно.
вам их всё равно парсить и переводить в нормальный вид: две части,
1. целая.
2. дробная.
сначала надо сравнить №1.
если №1 равны, то сравнивайте №2. Но не прямо, а допишете после более короткого №2 несколько нулей, что-бы части №2 были одинаковой длинны. Например
12.123 ? 12.7
12==12
123<700 → 12.123 < 12.7Как то так
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);
}1. целая.
2. дробная.
сначала надо сравнить №1.
Такой вариант тоже может быть "12,345.04" и после какого знака начинается дробная часть не определишь.
Поэтому я сначала забрал дробную часть, до первого не числа. Остальные числа идут в целую.
Может как то это можно упростить или улучшить ?
rezult/=10;
здесь ошибка:
x/10*10≠xТакой вариант тоже может быть "12,345.04" и после какого знака начинается дробная часть не определишь.
GIGO
marikk, вам нужно ВСЕГДА умножать на 10. При этом следить, что-бы десятичная точка была на одном месте. Что получается -- сравнивайте. Можно взять uint64_t, этого обычно хватает. Можно даже взять long double, вроде intel обещала, что всё будет точно без деления(и если не выходить за 2⁶⁴)
x/10*10≠x
Если оно отрабатывает одинаково, при одинаковом x, разницы при сравнении не будет.
здесь ошибка:
Тогда как положить последовательность цифр в дробную часть ?
Сравнивать две части по отдельности будет очень тяжко.
Если оно отрабатывает одинаково, при одинаковом x, разницы при сравнении не будет.
быть может не будет, а может и нет.
Тогда как положить последовательность цифр в дробную часть ?
я же говорю: как целые, только добивайте нулями то число, где цифр после точек меньше. Что бы цифр после точки было одинаково
12.123 → 12123
12.7 → 12700я же говорю: как целые,
А как в таком случае быть? "1234,5" и "123,45".
Может лучше сложить в строку нужного формата, в данном случае "xxx.xx" и через atof ?
1234.5 → 123450
123.45 → 12345Может лучше сложить в строку нужного формата, в данном случае "xxx.xx" и через atof ?
с некоторыми числами будет работать, с некоторыми не будет.
да, есть такая strchr(3), которая ищет точку.
все эти методы есть в QString - replace(), contains()
если у вас дробная часть одинакового размера то
str ="12345.678"
str.replace(QRegExp("[^0-9]"),"");//удалить все кроме цифр
//str = "12345678"
и сравнивайте
ежели разного то дополнить нулями
s1 = "123.4";
s2 ="123.456";
s1 += "00"
//s1 = "123.400"
удалить все кроме цифр
вот этого НЕ НУЖНО!
можно так
А в дробной части всегда два знака. Только что уточнил 
А в дробной части всегда два знака. Только что уточнил
тогда выкидывайте всё кроме цифр. ессно будет
1.5<0.25тогда выкидывайте всё кроме цифр. ессно будет
Да так и буду делать. Всем спасибо. Можно закрывать тему.
да, если НЕ БОЛЕЕ двух знаков после точки, то можно как-то так
if(s ~= "\.")
s += ".";
while(s ~= "\.[0-9][0-9]")
s += "0";Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Linux Forum → Программирование → Qt сравнить строки.
Форум работает на PunBB, при поддержке Informer Technologies, Inc