Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 wsprintf для форматирования double  [new]
LiYing
Member

Откуда:
Сообщений: 678
Не подходит?
var buffer: array[0..20] of Char;
wsprintf(buffer, '%0.4f', 12.33339);
MessageBox(0, buffer, '', MB_OK);

Показывает просто "f". Как тогда можно получить строку с отформатированным double до 4-х знаков после запятой? Без использования модуля System.SysUtils (для Format)/
23 ноя 21, 15:52    [22399744]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
LiYing
Как тогда можно получить строку с отформатированным double до 4-х знаков после запятой? Без использования модуля System.SysUtils (для Format)/
Никак. wsprintf не умеет работать с floating point
23 ноя 21, 16:53    [22399780]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
_Vasilisk_
wsprintf не умеет работать с floating point
Зато с ним работают StringCbPrintf, StringCbPrintfEx, StringCchPrintf, or StringCchPrintfEx.
23 ноя 21, 16:55    [22399782]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
LiYing
Member

Откуда:
Сообщений: 678
_Vasilisk_,
а в каком модуле они описаны? В Winapi.Windows нет.
23 ноя 21, 17:00    [22399785]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
LiYing
_Vasilisk_,
а в каком модуле они описаны? В Winapi.Windows нет.

Да ладно. В Windows.pas (D2007) точно есть.
23 ноя 21, 17:07    [22399789]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
LiYing
а в каком модуле они описаны? В Winapi.Windows нет.
Посмотрел детальнее - это не апишные, а библиотечные функции.

Так что придется преодолевать Ваше отвращение перед SysUtils.Format
23 ноя 21, 17:10    [22399793]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
rgreat
Member

Откуда:
Сообщений: 7024
Нууу...если там принципиально без SysUtils - всегда можно написать свой велосипед. ;)
23 ноя 21, 17:13    [22399796]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
LiYing
Member

Откуда:
Сообщений: 678
rgreat
Нууу...если там принципиально без SysUtils - всегда можно написать свой велосипед. ;)

Да как-то все велосипеды не едут на х64. Может у кого есть рабочий? :)
23 ноя 21, 18:03    [22399847]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
rgreat
Member

Откуда:
Сообщений: 7024
LiYing,

А ты ручками, типа for, round, Ord, Chr и т.п.:)
23 ноя 21, 18:04    [22399850]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
LiYing
...Может у кого есть рабочий? :)


SysUtils.Format() - ?
23 ноя 21, 18:08    [22399853]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
LiYing
Member

Откуда:
Сообщений: 678
ъъъъъ
SysUtils.Format() - ?

В первом же посте написано, что без SysUtils. Ну требования такие, не моя хотелка :(
23 ноя 21, 18:29    [22399868]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
LiYing,

а тупо реализацию выдрать?

Сообщение было отредактировано: 23 ноя 21, 18:35
23 ноя 21, 18:34    [22399873]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 985
Самый примитив...
Str(Trunc(Num))+'.'+Str(Frac(Num)*10000)
23 ноя 21, 18:35    [22399874]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
rgreat
Member

Откуда:
Сообщений: 7024
ъъъъъ
LiYing,

а тупо реализацию выдрать?

Там все через Compiler Magic.
23 ноя 21, 18:48    [22399881]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
defecator
Member

Откуда:
Сообщений: 39862
rgreat
ъъъъъ
LiYing,

а тупо реализацию выдрать?

Там все через Compiler Magic.


можно выдрать из Dephi 7, например
там ещё не было этой грязи
23 ноя 21, 20:10    [22399924]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
defecator,

там ассемблер.
23 ноя 21, 20:12    [22399927]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
defecator
Member

Откуда:
Сообщений: 39862
ъъъъъ
defecator,

там ассемблер.


Посмотрел сейчас - и впрямь ассемблер

Ну тогда из дельфи xe7 - выкусить только ветку PUREPASCAL

в любом случае - работа творческая )))

Сообщение было отредактировано: 23 ноя 21, 20:22
23 ноя 21, 20:17    [22399934]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
LiYing
Member

Откуда:
Сообщений: 678
defecator
Ну тогда из дельфи xe7 - выкусить только ветку PUREPASCAL

Выкусите? :) У меня только 10.4, нет xe7.
23 ноя 21, 20:23    [22399939]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
LiYing
defecator
Ну тогда из дельфи xe7 - выкусить только ветку PUREPASCAL

Выкусите? :) У меня только 10.4, нет xe7.

И что, нет версии без ассемблера? Не верю.
23 ноя 21, 20:33    [22399943]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
LiYing
Member

Откуда:
Сообщений: 678
ъъъъъ
И что, нет версии без ассемблера? Не верю.

Не знаю, сейчас не могу посмотреть, т.к. студия на работе да и пишут про хе7... только завтра.
23 ноя 21, 20:50    [22399950]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
defecator
Member

Откуда:
Сообщений: 39862
LiYing
ъъъъъ
И что, нет версии без ассемблера? Не верю.

Не знаю, сейчас не могу посмотреть, т.к. студия на работе да и пишут про хе7... только завтра.


Странный какой-то программист
На компе дома Дельфи нет....Поколение тиктокеров ?
23 ноя 21, 21:02    [22399953]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
LiYing
Member

Откуда:
Сообщений: 678
defecator
Странный какой-то программист
На компе дома Дельфи нет....Поколение тиктокеров ?

Ага, тиктокер, 1961 г.р.)) Хватает чем заниматься дома, окромя Дельфи.
23 ноя 21, 21:09    [22399956]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2654
LiYing
ъъъъъ
SysUtils.Format() - ?

В первом же посте написано, что без SysUtils. Ну требования такие, не моя хотелка :(
А как обосновали идиотские требования?
24 ноя 21, 04:35    [22400013]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
LiYing
Member

Откуда:
Сообщений: 678
Fr0sT-Brutal
Самый примитив...
Str(Trunc(Num))+'.'+Str(Frac(Num)*10000)

В принципе, данное решение (с мелкими изменениями) устраивает. Всем спасибо!
24 ноя 21, 08:44    [22400037]     Ответить | Цитировать Сообщить модератору
 Re: wsprintf для форматирования double  [new]
Bred eFeM
Member

Откуда:
Сообщений: 573
LiYing, не помню тестировал ли, но помню что было оч давно )
+
unit CrtLib;
interface

 function Dbl2Str(lf:Double):string;
 function Dbl2Sta(lf:Double):AnsiString;
 function Dbl2StrN(Lf:Double;pr:Cardinal = 3):string;
 function Dbl2StaN(lf:Double;pr:Cardinal = 3):AnsiString;
 function Str2Dbl(const wStr :String):Double;     overload;
 function Str2Dbl(const aStr :AnsiString):Double; overload;

 function sprintf (S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl; varargs;
 function swprintf(S: PChar;     const Format: PChar)    : Integer; cdecl; varargs;
 function strtod(s :PAnsiChar ; endptr:PPAnsiChar): double; cdecl;
 function wcstod(s :PChar ; endptr:PPChar): double; cdecl;

implementation

const
 msvcrt = 'msvcrt.dll';

 function sprintf (S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl; varargs; external msvcrt;
 function swprintf(S: PChar;     const Format: PChar)    : Integer; cdecl; varargs; external msvcrt;
 function strtod(s :PAnsiChar ; endptr:PPAnsiChar): Double; cdecl; external msvcrt;
 function wcstod(s :PChar ; endptr:PPChar): Double; cdecl; external msvcrt;

function Dbl2Str(lf:Double):string;
const cFmt = UnicodeString('%lg');
var   Buff:array [0..1023] of Char;
begin
 SetString(Result,Buff,swprintf(Buff, cFmt, Lf));
end;

function Dbl2StrN(Lf:Double;pr:Cardinal):string;
const
 cFmt = UnicodeString('%.*lf');
var
 Buff:array [0..1023] of Char;
begin
 SetString(Result,Buff,swprintf(Buff, cFmt, pr, Lf));
end;

function Dbl2Sta(Lf:Double):AnsiString;
const
 cFmt = AnsiString('%lg');
var
 Buff:array [0..1023] of AnsiChar;
begin
 SetString(Result,Buff,sprintf(Buff, cFmt, Lf));
end;

function Dbl2StaN(Lf:Double;pr:Cardinal):AnsiString;
const cFmt = AnsiString('%.*lf');
var   Buff:array [0..1023] of AnsiChar;
begin
 SetString(Result,Buff,sprintf(Buff, cFmt, pr, Lf));
end;

function Str2Dbl(const wStr :String):Double;
var
 eP : PChar;
begin
 Result := wcstod(PChar(wStr),@eP);
end;

function Str2Dbl(const aStr :AnsiString):Double;
var
 eP : PAnsiChar;
begin
 Result := strtod(PAnsiChar(aStr),@eP);
end;

end.
24 ноя 21, 20:57    [22400409]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить