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

Odpowiedz Nowy wątek
2019-01-18 16:25
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.

edytowany 1x, ostatnio: furious programming, 2019-01-25 17:03

Pozostało 580 znaków

2019-01-18 20:35
0

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

Pozostało 580 znaków

2019-01-18 20:39
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
edytowany 1x, ostatnio: furious programming, 2019-01-25 17:04

Pozostało 580 znaków

2019-01-18 20:41
0
  Uses
    Crt,Dos,Math,SysUtils;
    {$IFDEF UNIX}{$IFDEF UseCThreads}
       cthreads,
    {$ENDIF}{$ENDIF}
//    Classes  

Pozostało 580 znaków

2019-01-18 20:46
0

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

Pozostało 580 znaków

2019-01-20 09:11
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

faktycznie proste i optymalne rozwiazanie - Leroy 2019-01-20 12:28

Pozostało 580 znaków

2019-01-20 17:44
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 :)


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-01-20 17:47
0

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

Ale ja nie twierdzę, że to nie działa, tylko nie do końca jestem przekonany, że to jest optymalne rozwiązanie. Ale jak pisałem wyżej - jeśli się u Ciebie sprawdza, to nie mam powodów, żeby je kwestionować ;) - cerrato 2019-01-20 18:03

Pozostało 580 znaków

2019-01-20 20:27
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.

edytowany 1x, ostatnio: furious programming, 2019-01-21 04:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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