1 (27.02.2014 11:06:50 отредактировано marikk)

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

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

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

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

2

marikk пишет:

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

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

    #include <string>
    #include <cstdlib>
     
    std::string test("0.6");
    double value = ::atof(test.c_str());
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3

marikk пишет:

12 345,04

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

4

drBatty пишет:

"0.6"

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

5

drBatty пишет:

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

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

6

marikk пишет:

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

конечно. В английской локали точка. AFAIK atof(3) только по-англ. понимает.

marikk пишет:

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

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

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

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

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

12.123 ? 12.7
12==12
123<700 → 12.123 < 12.7
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

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);
}
drBatty пишет:

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

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

8

marikk пишет:

rezult/=10;

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

x/10*10≠x
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9

marikk пишет:

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

GIGO

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

10

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

11

drBatty пишет:

x/10*10≠x

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

drBatty пишет:

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

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

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

12 (27.02.2014 12:58:19 отредактировано drBatty)

marikk пишет:

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

быть может не будет, а может и нет.

marikk пишет:

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

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

12.123 → 12123
12.7   → 12700
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

13 (27.02.2014 13:04:49 отредактировано marikk)

drBatty пишет:

я же говорю: как целые,

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

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

14

1234.5 → 123450
123.45 →  12345
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15

marikk пишет:

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

с некоторыми числами будет работать, с некоторыми не будет.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

16

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

17 (27.02.2014 14:09:58 отредактировано vic5710)

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

18

vic5710 пишет:

удалить все кроме цифр

вот этого НЕ НУЖНО!

можно так

 Консоль:
$ echo "1234.456789"|sed -r 's/$/0000000000/;s/([0-9]*)\.([0-9]{10})0*/\1\2/'
12344567890000

на регулярки Qt сами переписывайте, мне лень.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

19

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

20

marikk пишет:

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

тогда выкидывайте всё кроме цифр. ессно будет

1.5<0.25
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

21 (27.02.2014 13:59:39 отредактировано marikk)

drBatty пишет:

тогда выкидывайте всё кроме цифр. ессно будет

Да так и буду делать. Всем спасибо. Можно закрывать тему.

22

да, если НЕ БОЛЕЕ двух знаков после точки, то можно как-то так

if(s ~= "\.")
  s += ".";
while(s ~= "\.[0-9][0-9]")
  s += "0";
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)