Форум: "WinAPI";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
ВнизКонвертация double и int64 в string Найти похожие ветки
← →
GoldenFILL (2002-12-14 13:28) [0]Народ есть тут кто может подсказать, как преобразовать double и Integer в string используя в секции uses только windows ( без использования variant и sysutils) ???? Задолбили эти типы уже Help me plz..
← →
Anatoly Podgoretsky (2002-12-14 13:35) [1]Ну раз не хочешь использовать эти модули, то вырежи из них процедуры конвертации или вообзе напиши свои
← →
GoldenFILL (2002-12-14 13:53) [2]Да я уже просматривал, там три четверти модуля SysUtils подвязано, да еще в том числе 4 функции в ассемблерных кодах.
А я уже перебрал все свои куцые мозги, не получается.
Дело в том, что у меня весь сервак занимает 21 кило, а цепляя только SysUtils сразу прога жирнеет до 60 кило.
Может у кого есть заготовка ?????
← →
Anatoly Podgoretsky (2002-12-14 14:04) [3]Преобразование IntXX займет очень мало места и очень маленький код, это обсуждается даже в уроках Зотова для самых неграмотных, это деление по модудю 10
← →
Sbabay (2002-12-14 15:17) [4]function strtoint(s:string):integer;
var
d,k:integer;
begin
result:=0;
d:=length(s);
k:=1;
repeat
result:=result+(ord(s[d])-48)*k;
k:=k*10;
d:=d-1;
until d=0;
end;
function inttostr(z:integer):string;
begin
repeat
result:=chr(48+(z mod 10))+result;
z:=z div 10;
until z=0;
end;
← →
asmith (2002-12-14 17:27) [5]Во времена писания аппликаций на WinAPI всегда пользовался функцией wsprintf, она во многом похожа на обычный printf из С
← →
Alex Konshin (2002-12-14 22:04) [6]Немного не в тему, но, думаю, это может быть интересно многим, особенно тем, кто пытается обойтись без использования SysUtils.
Это статья "Win32 Equivalents for C Run-Time Functions":
http://support.microsoft.com/default.aspx?scid=KB;en-us;q99456
← →
GoldenFILL (2002-12-15 06:02) [7]Cпасибо за подсказку :)))
Но представленный пример только половина ответа с которой в общем и сам справился, что касается типа данных Integer, правда немного более ламерским методом (хех) :)). А вот к типу Double он не подходит. Эта функция не пониме что может иметь место такие понятия как плавающая запятая :)) вот это мне уже башку разломило.
Пробовал расшифровать SysUtils Но там можно ногу сломить в переплетениях структуры кода ( да и откровенно до конца так и не разобрал ассемблерный код функции FormatBuf() уж больно наворочен :(( ).
← →
GoldenFILL (2002-12-15 06:06) [8]P.S.
Я думаю, что этот метод можно реализовать путем побитовой обработки значения (но у меня пока не получается)
← →
AlexandrRya (2002-12-15 10:52) [9]procedure DwordToStr(X:DWORD;S:PCHAR);
var Ar:Array [0..0] of DWORD;
begin
ar[0]:=X;
wvsprintf(S,"%d",PCHAR(@ar[0]));
end;
Вроде так - может где и ошибся, но wvsprintf использовать надо - Delphi под рукой нет - не могу проверить!
← →
Anatoly Podgoretsky (2002-12-15 11:12) [10]GoldenFILL © (15.12.02 06:02)
Учто только что приведенный пример работает только для положительных чисел, к нему надо добавлять обработку и знака числа.
← →
icWasya (2002-12-15 12:15) [11]var D:Double;
S:String;
STR(D:10:5,S);
← →
GoldenFILL (2002-12-15 12:39) [12]УФ :((
Я уже стал гнать с этими делами, ни3.14ера в голову не лезет
Кто дополнит код ????
-
-
-
function _IntToStrC(numb: Int64): string;
begin
repeat
result := chr(48 + (numb mod 10)) + result;
numb := numb div 10;
until numb = 0;
end;
function _IntToStrD(numb: Double): string;
begin
//Вот тут у меня крыша едет :(((
end;
function TForm1.IntToStr(numb: Variant): string;
begin
case TVarData(numb).VType of
{Smallint} 2:Result:=_IntToStrC(numb);
{Integer}
{LongInt} 3:Result:=_IntToStrC(numb);
{Single}
{Real} 4:Result:=_IntToStrD(numb);
{Comp}
{Extended}
{Double}
{Real48} 5:Result:=_IntToStrD(numb);
{Currency} 6:Result:=_IntToStrD(numb);
{ShortInt}16:Result:=_IntToStrC(numb);
{Byte} 17:Result:=_IntToStrC(numb);
{Word} 18:Result:=_IntToStrC(numb);
{LongWord}19:Result:=_IntToStrC(numb);
{Cardinal}
{Int64} 20:Result:=_IntToStrC(numb);
else
Result := "";
end;
end;
← →
Fantasist (2002-12-16 06:53) [13]Грм... Ой фиговое это дело, если в нем мало что понимаешь. :) Да еще и на Delphi - побитово тяжело работать.
И тем не менее:
function DToS(D:Double; CalcFract:boolean=True):string;
var
pW:^Word;
i,j:integer;
int_val:int64;
frac_val:double;
s,fs:string;
function sh(m,n:integer):int64;
begin
if n<0 then
Result:=m shl (-n)
else
Result:=m shr n;
end;
begin
if D=0 then
begin
Result:="0";
exit;
end;
fs:="";
pW:=@D;
inc(pW,3);
i:=((pW^ and $3FFF) shr 4)+1; //степень двойки
if (pW^ and $8000) = $8000 then s:="-"
else s:="";
//считаем целую часть. (степень двойки прибавим потом)
int_val:=sh(pW^ and $F,4-i);
j:=i;
if i>4 then
begin
Dec(pW);
Inc(int_val,sh(pW^,16-(i-4)));
j:=16-(i-4);
if i>20 then
begin
Dec(pW);
Inc(int_val,sh(pW^,16-(i-20)));
j:=16-(i-20);
if i>36 then
begin
Dec(pW);
Inc(int_val,sh(pW^,16-(i-36)));
j:=16-(i-36);
end;
end;
end;
//целую часть в строку (с прибавляем степени двойки)
s:=s+IntToStr((2 shl (i-1))+int_val);
//считаем дробную часть.
if CalcFract then
begin
frac_val:=0;
//j - сколько бит осталось в текущем слове - это начало дробной части
for i:=1 to j do
if (pW^ shr (j-i)) and 1=1 then
frac_val:=frac_val+1/(1 shl i); //увеличеваем на 2 в степени -i
if pW<>@D then
begin
Dec(pW);
for i:=0 to 15 do
if (pW^ shr (15-i)) and 1=1 then
frac_val:=frac_val+1/(1 shl (i+j-1)); //увеличеваем на 2 в степени -(i+j-1)
end;
fs:=","+DToS(frac_val*10000,False);
end;
s:=s+fs;
Result:=s;
end;
Целую часть переводит точно, пока она не становиться слишком большой. Попытка в int64 занести 15 shr 30 уже приводит к переполнению, а казалось должно влазить. Может я чего про этот int64 не догнал.
С дробной частью хуже. :) В 85% случаев переводиться правильно с точностью до 2-ух знаков, в 50% переводиться совершенно точно(точность у меня ограниченна 4-мя знаками). Где-то я какие-то биты упускаю, но что-то надоело их искать.
Короче, поизвращался я по полной программе, вам того же не советую.
Как вариант переводить в Currency - это уже фиксированная точка, и уже от него пахать.
← →
Diamond Cat (2002-12-16 11:15) [14]а может не парить голову и просто создать массив соответствия
в упращенном варианте типа
var
d:array [0..9] of string; //к примеру
begin
Заполняем массив
типа d[0]:="0";
d[1]:="1"; и т.д.
if i=1 then d[i]..... далее по смыслу
← →
AlexandrRya (2002-12-17 23:15) [15]Народ, а чем плох мой вариант?
Можно и еще проще:
function MyIntToStr(X:Integer):String;
var lpOut:Array[0..10] of char;
begin
wvsprintf(lpOut,"%d",@X);
result:=String(lpOut);
end;
← →
Anatoly Podgoretsky (2002-12-17 23:36) [16]AlexandrRya (17.12.02 23:15)
Ни чем не плох
GoldenFILL © (15.12.02 12:39)
Кто дополнит код ????
function _IntToStrC(Numb: Int64): string;
var
Sign : Boolean;
begin
Sign := Numb < 0;
Numb := Abs(Numb);
repeat
Result := Chr(48 + (Numb mod 10)) + result;
Numb := Numb div 10;
until Numb = 0;
if Sign then Result := "-" + Result;
end;
icWasya © (15.12.02 12:15)
Этот вариант тоже нормален, поскольку это в модуле System
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c