Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

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

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

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


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

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


 
umbra ©   (2006-09-15 16:37) [42]

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


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

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


 
umbra ©   (2006-09-15 17:23) [44]

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 17:33) [45]

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


 
umbra ©   (2006-09-15 17:41) [46]


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


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


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

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


 
sniknik ©   (2006-09-15 17:56) [48]

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

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


 
sniknik ©   (2006-09-15 17:58) [49]

http://delphimaster.net/view/3-1158153248/


 
umbra ©   (2006-09-15 18:26) [50]


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

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


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

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

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

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

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


 
umbra ©   (2006-09-18 11:49) [52]

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


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

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



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

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.034 c
2-1160746798
Дмитрий_Б
2006-10-13 17:39
2006.10.29
QickReport


1-1158318005
xyz777
2006-09-15 15:00
2006.10.29
ExcelApplication (Активировать ЛИСТ3)


15-1159804291
Piter
2006-10-02 19:51
2006.10.29
Нужно проапгрейдить компьютер для игры в Battlefield-2


15-1160131081
пуля
2006-10-06 14:38
2006.10.29
iis


15-1160362840
Slider007
2006-10-09 07:00
2006.10.29
С днем рождения ! 9 декабря