Wczytywanie liczb zmiennoprzecinkowych z klawiatury – kropka czy przecinek jako separator dziesiętny?

0

Witam.
Czy w Lazarusie można zmienić separator części całkowitej od ułamkowej z kropki na przecinek?
Przejrzałem opcje ale na nic takiego nie znalazłem.
Przy wczytywaniu danych z klawiatury należy użyć kropki ale byłoby łatwiej i szybciej użyć przecinka.

0

Jeżeli chodzi o wprowadzanie licz w skompilowanych aplikacjach to zależy od ustawień opcji regionalnych w systemie, można te wymusić zmianę separatora dla samej aplikacji

DefaultFormatSettings.DecimalSeparator:=',';

Jeżeli chodzi o edytor kodu, to nie, ponieważ taka specyfikacja języka (pascal).

0

Wstawiłem to polecenie go programu głównego i do procedury do której to polecenie powinno dotyczyć ale pojawia się ten sam błąd

ZapisKlawiaturaDysk.pas(26,5) Error: Identifier not found "DefaultFormatSettings"
0

jeżeli to jest aplikacja konsolowa to we własnym zakresie musisz zamienić ciąg na liczbę, np:

program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils
  { you can add units after this };

{$R *.res}

var
  d: double;
  s: String;
  fs: TFormatSettings;
begin
  fs.DecimalSeparator:=',';
  ReadLn(s);
  if TryStrToFloat(s, d, fs) then
  WriteLn(d)
  else
  WriteLn('Podano nieprawidłową liczbę');
  ReadLn();
end.
0

Może dodam załącznik i wyjaśni to trochę więcej

0

Ale tu nie ma co wyjaśniać @Paweł Dmitruk podał ci gotowe rozwiązanie wystarczy, że w sfojej funkcji dopiszesz w sekcji var fs: TFormatSettings; i val zamienisz na TryStrToFloat

0

Nie działa
Kompilowany projekt, Obiekt docelowy:

ZapisKlawiaturaDysk.exe: Kod wyjścia 1,Błędy: 3,
ZapisKlawiaturaDysk.pas(32,9) Error: Identifier not found "TFormatSettings"
ZapisKlawiaturaDysk.pas(32,24) Error: Error in type definition
ZapisKlawiaturaDysk.pas(34,8) Error: Illegal qualifier
0

2 minuty googlowania. Dodaj do uses moduł sysutils

0

Błąd Kompilowany projekt, Obiekt docelowy:

ZapisKlawiaturaDysk.exe: Kod wyjścia 1,Błędy: 1,
ZapisKlawiaturaDysk.pas(10,4) Fatal: Syntax error, "BEGIN" expected but "identifier SYSUTILS" found
0

Gdzieś za wcześnie średnik postawiłeś. wklej kod

0

Wklejam kod

0

tak jak mówiłem w uses po math masz średnik zamień na przecinek a po sysutils postaw średnik.

0

Błąd

Kompilowany projekt, Obiekt docelowy: ZapisKlawiaturaDysk.exe: Kod wyjścia 1,Błędy: 1,
ZapisKlawiaturaDysk.pas(10,12) Fatal: Syntax error, ";" expected but "identifier SYSUTILS" found
0
  Uses
    Crt,Dos,Math,SysUtils;
    {$IFDEF UNIX}{$IFDEF UseCThreads}
       cthreads,
    {$ENDIF}{$ENDIF}
//    Classes  
0

Skompilowało się. Sprawdzę jutro. Teraz jest mi zimno i spać mi się chce
Do jutra

0

Witam.
Wprowadziłem wszystkie poprawki i nie działa.
Znalazłem znacznie prostsze rozwiązanie nie wymagające jakichś ekwilibrystycznych kombinacji.
W panelu sterowania należy doinstalować klawiaturę "ENG" a tam jest kropka. Przy wprowadzaniu danych przełączam na "ENG" a resztę programu piszę na klawiaturze "POL"

Tym samym zamykam wątek. Dzięki wszystkim za udział w dyskusji. Pozdrawiam Zbych

0

Nie jestem pewien, czy przełączanie ustawień regionalnych w panelu sterowania na czas pracy aplikacji, wykonywane globalnie dla całego systemu, jest najlepszym i najwygodniejszym rozwiązaniem, ale ważne, że Tobie to się sprawdza i czujesz się zadowolony :)

0

U mnie działa. Przełączanie klawiatur można wykonać przy odpalonym Lazarusie.

0

Jeśli przecinek jest wymaganym separatorem w wejściowej wartości (wczytywanej z klawiatury) to jedynym sensownym i przenośnym pomiędzy komputerami rozwiązaniem jest zamiana spodziewanego przecinka na bieżący separator dziesiętny i następnie konwersja liczby za pomocą odpowiedniej funkcji. Żadnych zabaw z ustawieniami klawiatury ani z istniejącymi ustawieniami regionalnymi.

Do wypełnienia struktury z ustawieniami regionalnymi służy globalna procedura GetFormatSettings. Można ją wywołać gdzieś na początku kodu lub za każdym razem gdy korzysta się ze struktury FormatSettings, tak aby zmiany wprowadzone w międzyczasie przez użytkownika nie wywaliły nam programu. Zamiana separatora może być wykonana za pomocą funkcji StringReplace. Aby kod nie generował wyjątków, do konwersji można użyć funkcji TryStrToFloat.

Przykład kompletnego programu niżej:

{$MODE OBJFPC}{$LONGSTRINGS ON}

uses
  SysUtils;

  function ReadFloat(out AValue: Double): Boolean;
  var
    Input: String;
  begin
    ReadLn(Input);

    Input := StringReplace(Input, ',', FormatSettings.DecimalSeparator, [rfReplaceAll]);
    Result := TryStrToFloat(Input, AValue);
  end;

var
  Value: Double;
begin
  GetFormatSettings();
  Write('type float: ');

  if ReadFloat(Value) then
    Write('value: ', Value:5:5)
  else
    Write('wrong number format');

  ReadLn();
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1