Текущий архив: 2006.11.26;
Скачать: CL | DM;
Вниз
Преобразование вариантных типов Найти похожие ветки
← →
guav © (2006-10-13 23:38) [0]Как задать формат для преобразование Double в Variant ?
Например, код:procedure TForm1.Button1Click(Sender: TObject);
var V: Variant;
begin
V := 1.5E-3;
Caption := V;
end;
выведет 0,0015 в заголовок с учётом DecimalSeparator, а хотелось бы, чтобы был экспоненциальный формат с точкой (т.е. что-то вроде 1.5E-3 или 1.5000E-003 ).
← →
Джо © (2006-10-13 23:45) [1]Самое простое, что смог придумать:
Caption := Format ("%e",[Double(V)]);
:)
← →
guav © (2006-10-13 23:59) [2]> [1] Джо © (13.10.06 23:45)
Ну это с преобразованием в строку, так и я могу:function EnsureProperStringFormat(V: Variant): Variant;
begin
case VarType(V) of
varDouble, varSingle: Result := FloatToStrF(V, ffExponent, 15, 3);
else
Result := V;
end;
end;
Интересует такой код, чтобы V оставалась числом, но преобразовывалась когда требуется преобразовать как мне хочется.
← →
Джо © (2006-10-14 00:05) [3]> Интересует такой код, чтобы V оставалась числом, но преобразовывалась
> когда требуется преобразовать как мне хочется.
Ничего не понял, если честно. "1.5E-3" — это уже текстовое представление данных. Внутренне в Variant такие числа хранятся все-равно в Double.
← →
Джо © (2006-10-14 00:11) [4]> все-равно в Double
Ну, или в Single, смотря какое значение присваивать будешь.
← →
guav © (2006-10-14 00:22) [5]> [3] Джо © (14.10.06 00:05)
Перефразирую:
Сделать так, чтобы присвоение Caption := V; приводило к желаемому результату, при этом не искать такие места по всей программе, и при этом чтобы две такие переменные складывались как Double, а не как строки.
← →
Джо © (2006-10-14 00:39) [6]> и при этом чтобы две такие переменные складывались как
> Double, а не как строки.
Они и так будут складываться, как Double. Ну, если уж очень хочется видеть это явно, то складывай как TVarData(V1).VDouble + TVarData(V2).VDouble — но смысл-то в этом какой?
> чтобы присвоение Caption := V; приводило к желаемому результату,
> при этом не искать такие места по всей программе,
ИМХО, это невозможно. Caption := V приведет к вызовуprocedure _VarToLStr(var S: string; const V: TVarData);
var
Temp: TVarData;
begin
if V.VType = varString then
S := String(V.VString)
else
begin
_VarInit(Temp);
try
_VarCast(Temp, V, varString);
S := String(Temp.VString);
finally
_VarClear(Temp);
end;
end;
end;
И, как ни копай, по-моему, никуда тут свой формат не вклинишь :)
← →
guav © (2006-10-14 00:56) [7]А мне кажется, что эти
System.VarToLStrProc := @_VarToLStr;
System.VarToWStrProc := @_VarToWStr;
можно попробовать подменить.
Или копать в сторону custom variant types.
Думаю пути есть, вопрос только насколько это сложно.
← →
Джо © (2006-10-14 00:58) [8]> [7] guav © (14.10.06 00:56)
> А мне кажется, что эти
> System.VarToLStrProc := @_VarToLStr;
> System.VarToWStrProc := @_VarToWStr;
Хм. Точно. Похоже, тут предусмотрен был обходной путь.
← →
Германн © (2006-10-14 01:09) [9]
> Хм. Точно. Похоже, тут предусмотрен был обходной путь.
Менять генофонд?
← →
Джо © (2006-10-14 01:11) [10]> [9] Германн © (14.10.06 01:09)
> Менять генофонд?
Зачем? просто подменить (присвоить) ссылку на свою процудуру переменной System.VarToLStrProc, вероятно.
← →
Германн © (2006-10-14 01:23) [11]
> Джо © (14.10.06 01:11) [10]
>
> > [9] Германн © (14.10.06 01:09)
> > Менять генофонд?
>
> Зачем? просто подменить (присвоить) ссылку на свою процудуру
> переменной System.VarToLStrProc, вероятно.
>
А есть такая переменная в System? System.VarToLStrProc.
← →
guav © (2006-10-14 21:29) [12]Облом.
Значения VarToLStrProc и VarToWStrProc не используются для преобразования ни в коде [0], ни в моём реальном коде, они используются для форматирующих подпрограмм из SysUtils и записи вариантов в текстовый файл.
Страницы: 1 вся ветка
Текущий архив: 2006.11.26;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.066 c