Главная страница
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.064 c
2-1160977973
dera
2006-10-16 09:52
2006.10.29
как работать со сканером штрих кодов?


2-1160545049
Dima L
2006-10-11 09:37
2006.10.29
OpenDialog


15-1159418720
Тульский
2006-09-28 08:45
2006.10.29
Понятие NULL


3-1157456213
Mishenka
2006-09-05 15:36
2006.10.29
Как в запросе сделать сортировку по нескольким полям?


2-1159904838
mr1Andersen
2006-10-03 23:47
2006.10.29
Как сделать так что бы программа сделанная на делфи, работала вес