Автор |
Сообщение |
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Решил не спамить в теме робота, написать сюда
Итак, задача состоит в следующем. Парсим строчки в файле, когда находим нужную, выуживаем из нее параметр какой нас интересует.
Дано:
строка "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;
} |
Трейс показывает интересные вещи
" ORDER_NUMBER=68359610" ОК
"68359610" ОК
"68359608" не понял, куда 2 пропало?
То есть проблема в том, что ами как то криво преобразует строку в число
Люди добрые, помогите! |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Мда, написал код тупее некуда:
Код: |
test = StrToNum("1234567890");
_TRACE(NumToStr(test, format = 1.0, separator=False));
|
Выводит 1234567936
Функция StrToNum как то криво работает. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
KoDe
Зарегистрирован: 31.05.2009
Сообщения: 13
|
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
|
Я тебе в аське тож ответил, сюда еще добавлю, что потом когда я уже из экселя буду считывать в переменную номер заявки, то ее тогда придется переводить из числа в строку, дальше опять отрезать лишнее и потом снова приводить в число.. Кароч лишний геморрой.
ЗЫ Больше не пиши сюда |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Мдя... Похоже числа больше 8ми знаков надо пополам разбивать..... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
000 писал(а): |
Мдя... Похоже числа больше 8ми знаков надо пополам разбивать..... |
Аха, даж больше 7. Написал им в саппорт, пусть чешутся.. Пока решил все преобразовывать в строку перед сравнением NumToStr работает нормально. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Ответ из саппорта, даж не знаю чо им на это ответить...
Цитата: |
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
|
Я давно знаю, что никакая тех поддержка не помогает. Пока сам не обойдешь косяк ничего не изменится....
А по своему они правы. Сандарт... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|