x.xxxx не является допустимой плавающей точкой.Конвертация между языками / местными жителями - PullRequest
9 голосов
/ 02 мая 2011

У меня есть испанский пользователь, который получает invalid floating point error при этом

var
  S : String;
  R : Real;
begin
  S := '3.12345';
  R := StrToFloat(S); //- Exception here.

Причина этого в том, что его местоположение использует , для десятичного разряда!
Как можно безопасно преобразовать приведенную выше строку в число с плавающей запятой для пользователя без его бомбардировки.

Ответы [ 4 ]

12 голосов
/ 02 мая 2011

Сверните свою собственную версию StrToFloat

function StrToFloat_UK(const AStr: string): Float;
var
  FS: TFormatSettings;
begin
  FS.Create('en-UK');
  Result:= StrToFloat(AStr, FS): 
end;

И используйте это вместо StrToFloat.

6 голосов
/ 02 мая 2011

Используйте вторую перегрузку StrToFloat с TFormatSettings, для которого DecimalSeparator установлено на ..

1 голос
/ 02 мая 2011

Вы можете использовать процедуру val, она не учитывает настройки локальной системы.

var
S : String;
R : Real;
Test: Integer;
begin
  S := '3.12345';
  Val(S, R, Test);
end;
0 голосов
/ 02 мая 2011

Если вы знаете , что строки используют . в качестве десятичного разделителя, то вы должны сделать что-то вроде

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.UpdateFormatSettings := false;
  DecimalSeparator := '.';
end;

Строка

Application.UpdateFormatSettings := false;

очень важно.Значение этого свойства по умолчанию равно true, и в этом случае переменная DecimalSeparator может быть возвращена к значению по умолчанию (например, ,) в любое время, например, когда вы переключаете пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...