![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
XML разделитель [D7]
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 в подарок
каким образом?