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.
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).
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"
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.
Może dodam załącznik i wyjaśni to trochę więcej
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
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
2 minuty googlowania. Dodaj do uses
moduł sysutils
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
Gdzieś za wcześnie średnik postawiłeś. wklej kod
Wklejam kod
tak jak mówiłem w uses
po math
masz średnik zamień na przecinek a po sysutils
postaw średnik.
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
Uses
Crt,Dos,Math,SysUtils;
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
// Classes
Skompilowało się. Sprawdzę jutro. Teraz jest mi zimno i spać mi się chce
Do jutra
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
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 :)
U mnie działa. Przełączanie klawiatur można wykonać przy odpalonym Lazarusie.
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.