Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#91

Re: Mathe mit Strings (die deutsche StringMatheLib ._. )

  Alt 18. Jul 2009, 11:29
Moin Stefan,
da ist glaub ich ein Fehler drinne:
Zitat von GPRSNerd:
Delphi-Quellcode:
function TMathe.ZahlNBereinigen(const ZahlN, BasisN: string): string;
//Zahl-String zur Basis N von allen Zeichen bereinigen, die nicht zwischen
// '0' und Chr(N) liegen
var
  i: Integer;
  ZahlN_: string;
begin
  ZahlN_:=Uppercase(ZahlN);
  for i := Length(ZahlN_) downto 1 do //Rückwärts da sonst mehrfach hintereinander
                                      //auftretende nicht erlaubte Zeichen nicht korrigiert würden
  begin
    if ((_GetZahl(ZahlN_[i]) < 0) or (_GetZahl(ZahlN_[i]) >= StrToInt(BasisN))) then
      Delete(ZahlN_, i, 1);
  end;

  Result:=ZahlN_;
end;
Zum einen musst du ein Vorzeichen ignorieren und zum anderen, würde ich _GetZahl puffern und StrToInt auch (da aber außerhalb der schleife).

Also etwas wie sowas:
Delphi-Quellcode:
function TMathe.ZahlNBereinigen(const ZahlN, BasisN: string): string;
//Zahl-String zur Basis N von allen Zeichen bereinigen, die nicht zwischen
// '0' und Chr(N) liegen
var
  ZahlN_: string;
  i, Ziffer, BasisInt, StartZeichen : Integer;
begin
  ZahlN_:=Uppercase(ZahlN);
  if Ord(a[1]) in [Ord('+'), Ord('-')] then
    StartZeichen := 2
  else
    StartZeichen := 1;
  BasisInt := StrToInt(BasisN);

  // Rückwärtige Schleife, da der String hinter der aktuellen Position
  // verkürzt wird
  for i := Length(ZahlN_) downto StartZeichen do
  begin
    Ziffer := _GetZahl(ZahlN_[i]);
    if (Ziffer < 0) or (Ziffer >= BasisInt) then
      Delete(ZahlN_, i, 1);
  end;

  Result:=ZahlN_;
end;
Zitat von himitsu:
Also im Prinzip sollte es so funktionieren - bei ImmerNormalisieren sowieso

Ich hab es eigentlich abschaltbar gemacht, falls man mit mehreren gekoppelten Berechnungen sich dieses sparren möchte, aber da sollte man dann vorher die "Eingabewerte" selber einmal manuell Normalisieren.
Naja, ich erwarte aber das Dezimalstellen('+12') mir immer 2 zurückgibt
Abgesehen davon müsste es eigentlich statt "a[Length(a)]" nur "a[1]" heißen.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat