Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Обработка строк Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Вт Фев 08, 2011 1:52 pm Ответить с цитатой Вернуться к началу

Решил не спамить в теме робота, написать сюда Smile
Итак, задача состоит в следующем. Парсим строчки в файле, когда находим нужную, выуживаем из нее параметр какой нас интересует.
Дано:
строка "TRANS_ID=23400011;STATUS=3;TRANS_NAME="Ввод заявки"; DESCRIPTION="(160) Заявка на покупку N 68359610 зарегистрирована."; ORDER_NUMBER=68359610;"
Надо выудить номер заявки и преобразовать ее в цифру.Я накалякал следующую функцию:
Код:
function tro_read(trnsid)
{
   ordrnumber = 0;
   f = fopen(FileTro, "r");            // Открываем файл для чтения
   if(f)                               // Если файл открыт без ошибок
   {
      while(!feof(f))                   // Читаем до конца файла построчно и ищем строку с нашей заявкой и ее статусом
      {
         s = fgets(f);
         if(StrFind(s, trnsid) > 0)
         {
            s = StrReplace(s, ";", ",");   // ами понимает и умеет разбирать строки, форматированные через запятую
            ordrstatus = StrExtract(s, 1);   // получаем строку типа STATUS=X. Если это STATUS=3, то заявка успешно отправлена в стакан
            if(ordrstatus == "STATUS=3")
            {
               ordrstatus = StrExtract(s, 4);   // получаем строку типа ORDER_NUMBER=XXXXXXXX
               _TRACE(ordrstatus);
               ordrstatus = StrReplace(ordrstatus, " ORDER_NUMBER=", "");   // стираем и оставляем только цифры
               _TRACE(ordrstatus);
               ordrnumber = StrToNum(ordrstatus);
               _TRACE(NumToStr(ordrnumber, format=1.0, separator=False));
            }   
         }
      }
      fclose(f);
   }
   return ordrnumber;
}

Трейс показывает интересные вещи Smile
" ORDER_NUMBER=68359610" ОК
"68359610" ОК
"68359608" не понял, куда 2 пропало?
То есть проблема в том, что ами как то криво преобразует строку в число Confused
Люди добрые, помогите!
Посмотреть профиль Отправить личное сообщение ICQ Number
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Вт Фев 08, 2011 3:43 pm Ответить с цитатой Вернуться к началу

Мда, написал код тупее некуда:
Код:
test = StrToNum("1234567890");
_TRACE(NumToStr(test, format = 1.0, separator=False));

Выводит 1234567936
Функция StrToNum как то криво работает.
Посмотреть профиль Отправить личное сообщение ICQ Number
KoDe



Зарегистрирован: 31.05.2009
Сообщения: 13

СообщениеДобавлено: Вт Фев 08, 2011 4:00 pm Ответить с цитатой Вернуться к началу

spitfire писал(а):
Мда, написал код тупее некуда:
Код:
test = StrToNum("1234567890");
_TRACE(NumToStr(test, format = 1.0, separator=False));

Выводит 1234567936
Функция StrToNum как то криво работает.


я тебе в аське уже написал, а тут для истории...
StrToNum работает криво при количестве символов >= 8 , пиши в саппорт, а на практике для идентификации ордеров можно ограничиться 7 символами, для этого в твой код нужно добавить следующие строчки:
Код:
ordrstatus2 = StrRight(ordrstatus, 7);
ordrnumber = StrToNum(ordrstatus2);


Последний раз редактировалось: KoDe (Вт Фев 08, 2011 5:36 pm), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Вт Фев 08, 2011 4:07 pm Ответить с цитатой Вернуться к началу

Я тебе в аське тож ответил, сюда еще добавлю, что потом когда я уже из экселя буду считывать в переменную номер заявки, то ее тогда придется переводить из числа в строку, дальше опять отрезать лишнее и потом снова приводить в число.. Кароч лишний геморрой.

ЗЫ Больше не пиши сюда Smile
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Фев 08, 2011 4:45 pm Ответить с цитатой Вернуться к началу

Мдя... Похоже числа больше 8ми знаков надо пополам разбивать.....

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Вт Фев 08, 2011 5:04 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Мдя... Похоже числа больше 8ми знаков надо пополам разбивать.....

Аха, даж больше 7. Написал им в саппорт, пусть чешутся.. Пока решил все преобразовывать в строку перед сравнением Smile NumToStr работает нормально.
Посмотреть профиль Отправить личное сообщение ICQ Number
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Вт Фев 08, 2011 5:38 pm Ответить с цитатой Вернуться к началу

Ответ из саппорта, даж не знаю чо им на это ответить... Confused
Цитата:
Hello,

Code written in ANY language is subject to FPU (floating point processor) accuracy limits.
This is world-wide IEEE 754 standard. Program may use either 32-bit or 64-bit floating point numbers.
All computers and all programs work with it and all codes regardless of language used using same FPU (part of your computer CPU).

Look at this: http://en.wikipedia.org/wiki/IEEE_754-1985
(this describes the standard, accuracy and all details).

AmiBroker uses 32bit IEEE floating point arithmetic in any computer has accuracy of 7 significant digits (some portfolio-level statistics however are calculated with 64-bit accuracy).

See also:
http://www.amibroker.com/kb/2010/07/20/about-floating-point-arithmetic/


btw - as regards accuracy - try the following in MS Excel (it uses double-precision 64-bit accuracy):
enter (1 and 16 zeros, you may need to change cell format to Numbers):
10000000000000000
in another cell enter:
10000000000000001
and check what you see.



Best regards

Marcin Gorzynski
Amibroker.com Technical Support

Это не наш косяк, это такой стандарт.. Тьфу, бездари!
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Фев 08, 2011 6:46 pm Ответить с цитатой Вернуться к началу

Я давно знаю, что никакая тех поддержка не помогает. Пока сам не обойдешь косяк ничего не изменится....

А по своему они правы. Сандарт... Smile

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen