Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-96603
Mic_2000
2003-01-13 15:53
2003.01.30
Сортировка в IBQuery без изменения SQL текста


6-96936
NewGuest
2002-12-06 19:33
2003.01.30
Мастера, раз в D7 не установлены компаненты типа TclientSocket,то


7-97060
LexusU
2002-11-20 11:46
2003.01.30
Как узнать нажата ли Caps Lock и какой язык ?


3-96580
Alexander_K
2003-01-10 15:44
2003.01.30
Может версия не та?


3-96541
sterran
2003-01-15 09:35
2003.01.30
Востановление записей помечанных на удаление





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский