Преобразуйте строку с запятыми для плавания

Если метод не помечен как 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()

См. Демо здесь [116 ]

10
задан Sombrero Chicken 23 November 2016 в 12:51
поделиться

5 ответов

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);
14
ответ дан 3 December 2019 в 14:44
поделиться

ниже - это то, что я использую. Там могут быть более эффективные способы, но это работает для меня. короче говоря, нет, я не знаю ни одной встроенной функции 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;
9
ответ дан 3 December 2019 в 14:44
поделиться

У меня была такая же проблема, когда мои пользователи должны вводить «научные» значения, такие как «1234,06 мВ». Здесь есть запятая, множитель (m = x0,001) и единица измерения (V). Я создал подпрограмму «широкоформатного» конвертера для обработки этих ситуаций. Брайан

0
ответ дан 3 December 2019 в 14:44
поделиться

Попробуйте: StrToFloat (StringReplace ('3,232.00', ',', '') Он должен избавиться от запятых перед выполнением преобразования.

В C # / VB.NET я использовал бы что-то вроде decimal.convert ("3,232.00", ",", "");

I Не знаю, как сделать преобразование без удаления лишних символов. На самом деле, в моей библиотеке есть специальная функция, которая убирает запятые и символы валют. Так что на самом деле вызовите MyConverer.decimalConverter ("$ 3,232.00");

4
ответ дан 3 December 2019 в 14:44
поделиться
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;
4
ответ дан 3 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: