Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

XML разделитель [D7]


Страницы:   1 2 3

REA ©   (2006-09-12 15:59:00) 

При записи в XML через TXMLDocument на одной машине системный разделитель (чисел с плавающей точкой) запятая.
На другой - точка и соответственно не читается.
Как с этим бороться?


REA   (2006-09-18 12:34:00) [1]

И то верно - работает. Похоже класс замещает функцию преобразования из строки в число. Как бы теперь сделать, чтобы и наоборот тоже работало?


umbra   (2006-09-18 11:49:00) [2]

вы код из [32] пробовали выполнить?


REA   (2006-09-18 11:00:00) [3]

>если тормоза для обмена критичны, то ты выбрал не тот формат для него...

Согласен, формат не самый удобный, но пока что работает. Переписывать уже лень.

>На основе собственного опыта я вижу, что DecimalSeparator  не влияет на преобразование при записи в файл, но влияет на преобразование при чтении.

Каким образом? Преобразование в OleVariant из текста делается похоже в библиотеке парсинга, а она про DecimalSeparator ничего не знает.


umbra   (2006-09-15 18:26:00) [4]


> DecimalSeparator как уже неоднократно говорилось не влияет
> на преобразование.

Кстати, хотя Reindeer Moss Eater ©   в [22] говорит, что во всех 4 сообщениях у него разделитель - запятая, у меня в четвертом сообщении стоит точка (Д7, msxml 4.0). И код из [32] у меня не вызывает исключений. На основе собственного опыта я вижу, что DecimalSeparator  не влияет на преобразование при записив файл, но влияет на преобразование при чтении.


sniknik   (2006-09-15 17:58:00) [5]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1158153248&n=1


sniknik   (2006-09-15 17:56:00) [6]

> К тому же исключения на больших объемах будут сильно тормозить.
если тормоза для обмена критичны, то ты выбрал не тот формат для него...

> формат то достоточно универсальный.
это только мечты маркетологов из мелкософта. не знаю в чем у тебя проблема (не сталкивался) но до универсальсти xml-ю очень далеко. (да и не бывает такого, это все одно, что машина универсал - типа и феррари обгонит, и груза больше белаза увезет, а если дороги нет то низко полетит... бред)


REA   (2006-09-15 17:48:00) [7]

>Затем можно спокойно обрабатывать весь файл
как обрабатывать? DecimalSeparator как уже неоднократно говорилось не влияет на преобразование.


umbra   (2006-09-15 17:41:00) [8]


> К тому же исключения на больших объемах будут сильно тормозить.


это делается одинраз для определения разделителя, использованного при записи файла. Затем можно спокойно обрабатывать весь файл. После обработки надо вернуть назад старый разделитель, открыть следующий файл и повторить процедуру.


REA   (2006-09-15 17:33:00) [9]

Вместо всего этого лучше всегда писать с точкой и читать с точкой. К тому же исключения на больших объемах будут сильно тормозить.
Я думал какое то стандартное решение есть - формат то достоточно универсальный. А вручную разумеется можно сделать преобразования.


umbra   (2006-09-15 17:23:00) [10]

var
 NewDecSeparator, OldDecSeparator: Char;
 buf: String;
{.......................................}
function FindSeparator(val: string): Char;
var
 i, count: integer;

begin
 count := 0;
 for i := 1 to length(val) do
   if (ord(val[i]) < 48) or (ord(val[i]) > 57) then//если это не цифра
     begin
       Result := val[i];
       Inc(count);
     end;
 if count <> 1 then//слишком много или слишком мало разделителей
   Result := '0';
end;
{..............................................................}
//берете первый попавшийся элемент, значение которого должно быть числом с //плавающей точкой.
mynode := XMLDocument1.ChildNodes.Nodes['ShouldBeDouble'];
buf := mynode.NodeValue;
try
 val := mynode.NodeValue;
except
 on EVariantTypeCastError do
     NewDecSeparator := FindSeparator(buf);
end;
if NewDecSeparator <> '0' then
 begin
   OldDecSeparator := DecimalSeparator;
   DecimalSeparator := NewDecSeparator;
 end;

после этого val := mynode.NodeValue;вызывать исключения не будет


REA   (2006-09-15 16:42:00) [11]

val := mynode.NodeValue; влепит Exception


umbra   (2006-09-15 16:37:00) [12]

а чем umbra © [32] не устраивает?


REA   (2006-09-15 16:31:00) [13]

Записать, прочитать разделитель можно, но преобразовывать то все равно вручную придется, а раз так, то можно и писать с точкой и читать с точкой, но это все дополнительные манипуляции.
Если нет других вариантов, придется читать как строку и потом делать StrToFloat. И еще заодно проверять на NAN.


Ketmar   (2006-09-15 16:12:00) [14]

что интересно -- давно ответили про Locale Settings. чего мусолить -- не понимаю. то, что изменение DecimalSeparator не меняет установок локали -- очевидно из исходников генофонда. то, что варианты преобразовывает система, которая знать не знает ни о каком DecimalSeparator -- очевидно после некоторых размышлений. осталось только свести эти два факта воедино.


umbra   (2006-09-15 16:04:00) [15]


> Да не влияет DecimalSeparator ни на запись ни на чтение

не влияет, но при запуске программы из DecimalSeparatorможно узнать, какой разделитель используется в системе, а значит, и какой будет записан в файл.


> SomeOleVariant

насколько я понял, при чтении из xml этот вариант всегда будет OleString. И именно от текущего DecimalSeparator зависит, будет исключение при преобразовании строки в Double или нет.


> А хочется чтобы формат XML не зависел от разделителя и писался
> однообразно.

Стандарт XML этого не предусматривает. Об этом должны позаботиться Вы путем указания разделителя, использованного при создании файла в самом этом файле. Если это по каким-то причинам невозможно, то Вам придется узнавть этот разделитель самому, например, прочтя значение элемента, которое должно быть представлением числа, поискать в нем символы-нецифры.


REA   (2006-09-15 15:01:00) [16]

Да не влияет DecimalSeparator ни на запись ни на чтение т.к. он играет роль только при StrToFloat, а в случает SomeDouble := SomeOleVariantбудет в зависимости от типа либо преобразование либо Exception (если там строка).
А хочется чтобы формат XML не зависел от разделителя и писался однообразно. Нет ли там в стандарте XML разделителя?


Slym(RO)   (2006-09-15 10:56:00) [17]

umbra ©   (15.09.06 10:32) [36]
на известных данных

все программы тестируются на известных данных, а после финального релиза и установки на N компах частота телефонных звонков =N*M, где M- количество строк separator[1]


umbra   (2006-09-15 10:32:00) [18]

в общем случае, конечно, да. Но это ж только иллюстрация на известных данных.
К тому же, если length(separator)=0, то нет никакого смысла копировать из памяти неизвестно что в качестве разделителя. :)


Slym(RO)   (2006-09-15 10:08:00) [19]

может оказаться что length(separator)=0


umbra   (2006-09-15 10:00:00) [20]


> separator[1]; - AV в подарок

каким образом?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо