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 на одной машине системный разделитель (чисел с плавающей точкой) запятая.
На другой - точка и соответственно не читается.
Как с этим бороться?


Slym(RO)   (2006-09-15 03:56:00) [21]

separator[1]; - AV в подарок
Copy(separator,1,1)!


umbra   (2006-09-14 20:35:00) [22]

вроде разобрался.

2 Reindeer Moss Eater ©   (14.09.06 16:37) [30]

зачем нам вообще запись в файл, если проблемы с чтением

REA   (14.09.06 16:16) [28]

пусть у нас есть xml-файл такого содержания

<test separator='a'>12a34</test>

Значение тэга можно преобразовать в doubleбез всяких проблем.
Напрмер

procedure TForm1.Button1Click(Sender: TObject);
var
 mynode: IXMLNode;
 separator : String;
 val : double;
 oldseparator: char;

begin
 XMLDocument1.LoadFromFile('test.xml');
 mynode := XMLDocument1.ChildNodes.Nodes['test'];
 oldseparator := DecimalSeparator;
 separator := mynode.Attributes['separator'];
 DecimalSeparator := separator[1];
 val := mynode.NodeValue;
 DecimalSeparator := oldseparator;
 ShowMessage(FloatToStr(val *10));
end;


umbra   (2006-09-14 17:36:00) [23]

тогда я вообще не понимаю в чем, собственно проблема. К Вашему коду я добавил строки

 XMLDocument1.SaveToFile('test.xml');
 DecimalSeparator := ',';
 XMLDocument1.LoadFromFile('test.xml'); //здесь поставил точку прерывания
 val := XMLDocument1.ChildNodes.Nodes['test'].Attributes['val'];

исправил в файле запятую на точку и не получил исключения!


Reindeer Moss Eater   (2006-09-14 16:37:00) [24]

Умбра, не влияет decimalseparator на чтение из файла. Не влияет.
Мой пример это демонстрирует.


umbra   (2006-09-14 16:35:00) [25]

2 REA   (14.09.06 16:16) [28]

чтобы сделать у себя такой же


REA   (2006-09-14 16:16:00) [26]

>Кто мешает в XML засунуть тег определяющий DecimalSeparator?
А сымсл?


REA   (2006-09-14 14:29:00) [27]

Поправочка - какой бы ни был Delphi сепаратор попадает системный сепаратор. Присваивается там дабл.


Reindeer Moss Eater   (2006-09-14 13:54:00) [28]

На том конце при формировании документа ноду или атрибуту присвоили не дабл, а строку.


Reindeer Moss Eater   (2006-09-14 13:52:00) [29]

При записи в файл происходит то же самое.
Какой бы ни был сепаратор, попадает запятая.


REA   (2006-09-14 13:49:00) [30]

Потому что эксперимент поставлен не в чистом виде. Надо записать на диск, поменять разделитель и попытаться прочитать.


REA   (2006-09-14 13:48:00) [31]

>Reindeer Moss Eater ©   (14.09.06 13:17) [20]
Первый и второй ShowMessage выводит с точкой. Т.е. DecimalSeparator как и ожидалось не влияет на преобразование.
Разумеется при обратном преобразовании из Double в строку будет использован DecimalSeparator, но до этого момента просто не дойдет, т.к. при попытке преобразовать из OleVariant (который будет воспринят как строка) вывалится Exception.
Так что мне бестолковому делать то?


Reindeer Moss Eater   (2006-09-14 13:44:00) [32]

В данном случае он действительно не влияет на запись/чтение из xml.
При любом разделителе у меня пишется запятая.
И при любом разделителе значение из нода попадает в дабл без проблем.


atruhin   (2006-09-14 13:40:00) [33]

> [20] Reindeer Moss Eater ©   (14.09.06 13:17)

Только не забыть перед этим запомнить предыдущее значение и после восстановить.


Reindeer Moss Eater   (2006-09-14 13:17:00) [34]

Причина в чем-то другом.
Например в том, что при рождении документа ноду val могли присвоить строковое значение с разделителем-точкой (сами преобразовали и записали как строку)

Вот пример со сменой разделителей.

procedure TForm1.Button1Click(Sender: TObject);
var val : Double; cStr : string;
begin
DecimalSeparator  := '.'; ThousandSeparator := ' ';
XMLDocument1.Active := True;
XMLDocument1.AddChild('test').Attributes['val'] := 12.34;
ShowMessage(XMLDocument1.xml.Text);

DecimalSeparator  := ',';
XMLDocument1.ChildNodes.Nodes['test'].Attributes['val'] := 12.34;

ShowMessage(XMLDocument1.xml.Text);

val := XMLDocument1.ChildNodes.Nodes['test'].Attributes['val'];
ShowMessage(Format('%10.2f',[val]));

DecimalSeparator  := '.';
val := XMLDocument1.ChildNodes.Nodes['test'].Attributes['val'];
ShowMessage(Format('%10.2f',[val]));
end;


Reindeer Moss Eater   (2006-09-14 13:08:00) [35]

Если заменить переменную decimal separator на преобразования это не повлияет.

Тогда ты что-то странное говоришь:
На то, какой разделитель попадает в файл при формировании якобы влияет decimalseparator. И одновременно его смена на приемной машине не влияет на преобразование из OleVarianta.


Slym(RO)   (2006-09-14 13:08:00) [36]

Кто мешает в XML засунуть тег определяющий DecimalSeparator?
<?xml version="1.0" encoding="Windows-1251" DecimalSeparator="." ?>
А в коде выделять его и перед загрузкой DecimalSeparator:=XML.Atrib['DecimalSeparator'];


simpson   (2006-09-14 13:02:00) [37]

По-моему, лучше всего при использовании XML строго оговаривать формат XML-документа, в том числе и какой decimal separator использовать. ;)


REA   (2006-09-14 13:00:00) [38]

>2Reindeer Moss Eater
При всем моем уважении иногда имеет смысл давать развернутые ответы на обозначенные вопросы, а не заставлять "читать мои труды".


REA   (2006-09-14 12:58:00) [39]

>Вроде предельно по-русски и предельно ясно.

Не совсем. Там используется насколько я понимаю OleVariant-ы.
Если заменить переменную decimal separator на преобразования это не повлияет. Если преобразовать до присвоения Node в строку, то скорее всего сработает, но это несколько грубоватое решение.


umbra   (2006-09-14 12:08:00) [40]

по-моему, лучше всего при создании XML записывать текущий DecimalSeparatorв него же, а при обработке читать из файла, и если обрабатывающая прога пишется на Д7 и больше, то использовать GetLocaleFormatSettings, а если меньше, то сравнимать разделитель из файла с текущим, и если они разные, то читать данные как строки, заменять разделитель и потом конвертировать в число.


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

Наверх

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