Вниз
Скачать: CL | DM;

XML разделитель   Найти похожие ветки 

← →
REA   (2006-09-12 15:59) [0]

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


← →
Reindeer Moss Eater ©   (2006-09-12 16:32) [1]

Заменить точку на запятую или наоборот.


← →
Loginov Dmitry ©   (2006-09-12 16:52) [2]

Используй DecimalSeparator


← →
Fay ©   (2006-09-12 22:32) [3]

2 Loginov Dmitry ©   (12.09.06 16:52) [2]
Как именно предполагается его использовать?
DecimalSeparator - просто какой-то символ.


← →
REA   (2006-09-13 11:02) [4]

И где там в TXMLDocument этот Decimal Separator?

>Заменить точку на запятую или наоборот.
Вручную что ли? А для чего тогда вообще этот XML, если парсинг вручную делать?


← →
Slym(RO)   (2006-09-13 11:32) [5]

Не пользуй Борландовский TXMLDocument, пользуй Микрософтовый CreateOleObject("MSXML.DOMDocument")


← →
REA   (2006-09-13 11:45) [6]

>2Slym(RO)  
А чем оно принципиально отличается? Мне кажется там просто обертка.


← →
Reindeer Moss Eater ©   (2006-09-13 11:58) [7]

Вручную что ли? А для чего тогда вообще этот XML, если парсинг вручную делать?

Кто тебе здесь сказал про ручной парсинг?


← →
umbra ©   (2006-09-13 12:47) [8]


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

в каком смысле не читается? насколько я знаю, XML без DTD или схемы ничего не знает ни о каких типах, и ему глубоко плевать, точка стоит в значении элемента или запятая.


← →
Reindeer Moss Eater ©   (2006-09-13 12:54) [9]

Все очень просто.
У него в приложении переменная и он работает с содержимым нода как с вариантом, присваивая значение нода или атрибута даблу.
дециамал сеператаор на машине-источнике документа и на машине приемнике разные. Отсюда и засада.

Причем здесь сам XML документ - непонятно. Тема верится вокруг банального StrToFloat


← →
REA   (2006-09-14 11:18) [10]

>2Reindeer Moss Eater

Предлагаешь вытащить в строку и StrToFloat сделать самому?
Можно пожалуй и так, но я думал там где нибудь есть встроенное средство.
А что в стандарте то по этому поводу?
DTD у меня действительно никакого нет.


← →
Reindeer Moss Eater ©   (2006-09-14 11:20) [11]

Нет не предлагаю. Где у меня написано, что я такое предлагаю?
Читай что у меня написано.


← →
REA   (2006-09-14 11:29) [12]

Написано "Заменить точку на запятую или наоборот."
Звучит неоднозначно... Где менять то?


← →
Reindeer Moss Eater ©   (2006-09-14 11:35) [13]

Ты : на одной машине системный разделитель (чисел с плавающей точкой) запятая.
На другой - точка


Я  : Заменить точку на запятую или наоборот.

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


← →
umbra ©   (2006-09-14 12:08) [14]

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


← →
REA   (2006-09-14 12:58) [15]

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

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


← →
REA   (2006-09-14 13:00) [16]

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


← →
simpson ©   (2006-09-14 13:02) [17]

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


← →
Slym(RO)   (2006-09-14 13:08) [18]

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


← →
Reindeer Moss Eater ©   (2006-09-14 13:08) [19]

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

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


← →
Reindeer Moss Eater ©   (2006-09-14 13:17) [20]

Причина в чем-то другом.
Например в том, что при рождении документа ноду 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;


← →
atruhin ©   (2006-09-14 13:40) [21]

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

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


← →
Reindeer Moss Eater ©   (2006-09-14 13:44) [22]

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


← →
REA   (2006-09-14 13:48) [23]

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


← →
REA   (2006-09-14 13:49) [24]

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


← →
Reindeer Moss Eater ©   (2006-09-14 13:52) [25]

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


← →
Reindeer Moss Eater ©   (2006-09-14 13:54) [26]

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


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

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


← →
REA   (2006-09-14 16:16) [28]

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


← →
umbra ©   (2006-09-14 16:35) [29]

2 REA   (14.09.06 16:16) [28]

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


← →
Reindeer Moss Eater ©   (2006-09-14 16:37) [30]

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


← →
umbra ©   (2006-09-14 17:36) [31]

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

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

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


← →
umbra ©   (2006-09-14 20:35) [32]

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

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;


← →
Slym(RO)   (2006-09-15 03:56) [33]

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


← →
umbra ©   (2006-09-15 10:00) [34]


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

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


← →
Slym(RO)   (2006-09-15 10:08) [35]

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


← →
umbra ©   (2006-09-15 10:32) [36]

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


← →
Slym(RO)   (2006-09-15 10:56) [37]

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

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


← →
REA   (2006-09-15 15:01) [38]

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


← →
umbra ©   (2006-09-15 16:04) [39]


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

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


> SomeOleVariant

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


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

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


← →
Ketmar ©   (2006-09-15 16:12) [40]

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



Страницы: 1 2 вся ветка

Скачать: CL | DM;



Память: 0.55 MB
Время: 0.043 c
2-1160747147
dera
2006-10-13 17:45
2006.10.29
Вопрос любителям SQL


15-1160078303
SkySpeed
2006-10-05 23:58
2006.10.29
Где скачать балеты Чайковского: Щелкунчик и Лебединное озеро?


4-1150313195
Rules
2006-06-14 23:26
2006.10.29
Определение запуска приложения


15-1159935359
Nic
2006-10-04 08:15
2006.10.29
Ваш распорядок дня на работе?


15-1160057772
ArtemESC
2006-10-05 18:16
2006.10.29
Работа...




   Наверх