Текущий архив: 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