Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Bruch einlesen (https://www.delphipraxis.net/93732-bruch-einlesen.html)

DeddyH 10. Jun 2007 17:52

Re: Bruch einlesen
 
Dann schau doch mal in der Hilfe, was "ShowMessage" bewirkt.

PetBurki 10. Jun 2007 17:52

Re: Bruch einlesen
 
ok, konkrete Frage: Was genau macht StrToFloat?

r2c2 10. Jun 2007 17:53

Re: Bruch einlesen
 
Zitat:

Zitat von PetBurki
das sind keine Hausaufgaben. Das mache ich nur für mich, in der Hoffnung ein bischen mehr zu können als uns der Lehrer beibringt.

Und was soll es dir bringen, wenn du die Lösung kennst, aber nicht verstehst, weil du dich selbst nicht damit beschäftigst...? :gruebel:

mfg

Christian

Matze 10. Jun 2007 17:54

Re: Bruch einlesen
 
Setze den Caret (blinkendes Strichlein im Code-Editor) auf diese Funktion und drücke F1. Du wirst wundern, dass du solche Dinge auf die einfache Art und Weise selbst herausbekommen kannst. ;)

r2c2 10. Jun 2007 17:54

Re: Bruch einlesen
 
Zitat:

Zitat von PetBurki
ok, konkrete Frage: Was genau macht StrToFloat?

Weißt du, wie sich die F1-Taste auf deiner Tastatur befindet? Einfach StrToFloat in Delphi eingeben und F1 drücken...

//Edit: 2 Mal hintereinander kein Roter Kasten... :cry:

mfg

Christian

DeddyH 10. Jun 2007 17:56

Re: Bruch einlesen
 
Genau, und das machst Du bei jedem Befehl, den Du nicht kennst. Du wirst Dich wundern, wie schnell Du lernst. :zwinker:

PetBurki 10. Jun 2007 18:00

Re: Bruch einlesen
 
danke, ich wustte nicht, dass das geht!

DeddyH 10. Jun 2007 18:04

Re: Bruch einlesen
 
Nun weißt Du es. Meinst Du denn, irgendjemand hier hätte alle Methoden der VCL samt Win32-API mit allen Parametern im Kopf? Den möchte ich sehen. :zwinker:

cruiser 10. Jun 2007 19:32

Re: Bruch einlesen
 
mh... mal eine Funktion, die einen String in eine Extended (Floatingpoint) Variable wandelt.

sollte die Eingabe ungültig sein gibt die Funktion NaN zurück

Beispieleingaben sind: '1,34', '-1,34', '2/3', '-2/3', '1 4/5', '-1 4/5'

Delphi-Quellcode:
function TextToFloat(const s: string): Extended;
const
  NaN = 0.0 / 0.0;
var
  allowed: set of Char;
  decpos,l,i: Integer;
  m, g, z, n: Extended;
  pc: ^Char;
  aftercomma, evalz, evaln: Boolean;

  // Hilfsfunktion fuer 10er Potenz
  function decposmul: Extended;
  begin
    Result := Exp(decpos * Ln(10));
  end;
begin
  // Ergebnis ist noch keine Zahl
  Result := NaN;

  // laenge ermitteln, bei bedarf rausgehn
  l := Length(s);
  if l = 0 then Exit;

  // Stati setzen
  allowed := ['0'..'9', ' ', '/'];
  aftercomma := False;
  evalz := False;
  evaln := False;

  // Position + Pointer auf Start setzen
  i := 1;
  pc := @s[i];

  // Positiv/Negativ Auswertung
  if pc^ = '-' then begin
    m := -1.0;
    Inc(pc);
    Inc(i);
  end else if pc^ = '+' then begin
    m := 1.0;
    Inc(pc);
    Inc(i);
  end else begin
    m := 1.0;
  end;

  // Werte setzen
  decpos := 0;
  g := 0.0;
  z := 0.0;
  n := 0.0;

  // Ganzzahl/Dezimalzal (X)
  while i <= l do begin
    // Zeichen nicht erlaubt -> Funktion beenden
    if not((pc^ in allowed) or (pc^ = DecimalSeparator)) then Exit;
    // Leerzeichen trennt ganze Zahl von Bruch
    if pc^ = ' ' then begin
      // Komma wurde vorher gefunden -> ungueltig
      if aftercomma then Exit;
      Inc(pc);
      Inc(i);
      evalz := True;
      Break;
    end;
    // Schraegstrich trennt Zaehler und Nenner
    if pc^ = '/' then begin
      // Komma wurde vorher gefunden -> ungueltig
      if aftercomma then Exit;
      z := g;
      g := 0.0;
      evaln := True;
      Inc(pc);
      Inc(i);
      Break;
    end;
    // Komma (oder Punkt) fuer Dezimalzahlen
    if pc^ = DecimalSeparator then begin
      aftercomma := True;
      Inc(pc);
      Inc(i);
      Continue;
    end;
    // Zahlen auswerten
    if aftercomma then begin
      Dec(decpos);
      g := decposmul * (Ord(pc^) - 48) + g;
    end else begin
      g := g * 10 + (Ord(pc^) - 48);
    end;
    Inc(i);
    Inc(pc);
  end;

  allowed := ['0'..'9', '/'];

  if evalz then begin
    while i <= l do begin
      // Zeichen nicht erlaubt -> Funktion beenden
      if not(pc^ in allowed) then Exit;
      if pc^ = '/' then begin
        if i = l then Exit;
        evaln := True;
        Inc(pc);
        Inc(i);
        Break;
      end;
      z := z * 10 + (Ord(pc^) - 48);
      Inc(decpos);
      Inc(pc);
      Inc(i);
    end;
  end;

  allowed := ['0'..'9'];

  if evaln then begin
    decpos := 0;
    while i <= l do begin
      // Zeichen nicht erlaubt -> Funktion beenden
      if not(pc^ in allowed) then Exit;
      n := n * 10 + (Ord(pc^) - 48);
      Inc(decpos);
      Inc(pc);
      Inc(i);
    end;
  end;

  if evalz and evaln then
    Result := m * (g + (z / n))
  else
    Result := m * g;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz