Если метод не помечен как virtual
, он не сохраняется в виртуальной таблице. В этом случае деструктор не сохраняется в виртуальной таблице. Так что это нельзя назвать.
С текущим кодом, vtables будет выглядеть следующим образом:
vtable for Derived:
.quad 0
.quad typeinfo for Derived
.quad Base::f()
vtable for Base:
.quad 0
.quad typeinfo for Base
.quad Base::f()
См. Демо здесь
[1110 ] Если деструктор помечен virtual
в Base
, vtables будет выглядеть следующим образом:
vtable for Derived:
.quad 0
.quad typeinfo for Derived
.quad Derived::~Derived() [complete object destructor]
.quad Derived::~Derived() [deleting destructor]
.quad Base::f()
vtable for Base:
.quad 0
.quad typeinfo for Base
.quad Base::~Base() [complete object destructor]
.quad Base::~Base() [deleting destructor]
.quad Base::f()
Do you exactly know, that '.' is decimal separator and ',' is thousand separator (always)? If so, then you should fill the TFormatSettings record and pass it to StrToFloat.
FillChar(FS, SizeOf(FS), 0);
... // filling other fields
FS.ThousandSeparator := ',';
FS.DecimalSeparator := '.';
V := StrToFloat(S, FS);
ниже - это то, что я использую. Там могут быть более эффективные способы, но это работает для меня. короче говоря, нет, я не знаю ни одной встроенной функции delphi, которая будет конвертировать строку с плавающей точкой, содержащую запятую, в число с плавающей точкой
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
safeFloat
Strips many bad characters from a string and returns it as a double.
}
function safeFloat(sStringFloat : AnsiString) : double;
var
dReturn : double;
begin
sStringFloat := stringReplace(sStringFloat, '%', '', [rfIgnoreCase, rfReplaceAll]);
sStringFloat := stringReplace(sStringFloat, '$', '', [rfIgnoreCase, rfReplaceAll]);
sStringFloat := stringReplace(sStringFloat, ' ', '', [rfIgnoreCase, rfReplaceAll]);
sStringFloat := stringReplace(sStringFloat, ',', '', [rfIgnoreCase, rfReplaceAll]);
try
dReturn := strToFloat(sStringFloat);
except
dReturn := 0;
end;
result := dReturn;
end;
У меня была такая же проблема, когда мои пользователи должны вводить «научные» значения, такие как «1234,06 мВ». Здесь есть запятая, множитель (m = x0,001) и единица измерения (V). Я создал подпрограмму «широкоформатного» конвертера для обработки этих ситуаций. Брайан
Попробуйте: StrToFloat (StringReplace ('3,232.00', ',', '')
Он должен избавиться от запятых перед выполнением преобразования.
В C # / VB.NET я использовал бы что-то вроде decimal.convert ("3,232.00", ",", "");
I Не знаю, как сделать преобразование без удаления лишних символов. На самом деле, в моей библиотеке есть специальная функция, которая убирает запятые и символы валют. Так что на самом деле вызовите MyConverer.decimalConverter ("$ 3,232.00");
function StrToFloat_Universal( pText : string ): Extended;
const
EUROPEAN_ST = ',';
AMERICAN_ST = '.';
var
lformatSettings : TFormatSettings;
lFinalValue : string;
lAmStDecimalPos : integer;
lIndx : Byte;
lIsAmerican : Boolean;
lIsEuropean : Boolean;
begin
lIsAmerican := False;
lIsEuropean := False;
for lIndx := Length( pText ) - 1 downto 0 do
begin
if ( pText[ lIndx ] = AMERICAN_ST ) then
begin
lIsAmerican := True;
pText := StringReplace( pText, ',', '', [ rfIgnoreCase, rfReplaceAll ]); //get rid of thousand incidental separators
Break;
end;
if ( pText[ lIndx ] = EUROPEAN_ST ) then
begin
lIsEuropean := True;
pText := StringReplace( pText, '.', '', [ rfIgnoreCase, rfReplaceAll ]); //get rid of thousand incidental separators
Break;
end;
end;
GetLocaleFormatSettings( LOCALE_SYSTEM_DEFAULT, lformatSettings );
if ( lformatSettings.DecimalSeparator = EUROPEAN_ST ) then
begin
if lIsAmerican then
begin
lFinalValue := StringReplace( pText, '.', ',', [ rfIgnoreCase, rfReplaceAll ] );
end;
end;
if ( lformatSettings.DecimalSeparator = AMERICAN_ST ) then
begin
if lIsEuropean then
begin
lFinalValue := StringReplace( pText, ',', '.', [ rfIgnoreCase, rfReplaceAll ] );
end;
end;
pText := lFinalValue;
Result := StrToFloat( pText, lformatSettings );
end;