Entwickler-Ecke

Sonstiges (Delphi) - Nullen ("0") herausschneiden !


Jagg - Fr 20.12.02 10:16
Titel: Nullen ("0") herausschneiden !
Hallo !

Ich habe ein EditFeld,wo ich die Nummer "009" eingebe,mit einem Enterklick will ich das,das Programm im Feld nach den Nullen sucht und die dann rausschneidet !
Also,soll dann nur noch eine "9" stehen anstatt "009" !

Wie mache ich das ?

mit Pos() etwa ?

Jagg !


Tino - Fr 20.12.02 10:21

Hallo Jagg,

die Idee mit Pos ist schon ganz gut. Ich gib Dir mal einen Tipp:

Du prüfst zu erst mit der o. g. Funktion ob eine 0 in dem String vorhanden ist. Wenn das der Fall ist dann löscht Du mit der Procedure Delete die 0. Dann prüfst Du wieder... Am besten packst Du das Prüfen und Löschen in eine While-Schleife.

Gruß
TINO


DaFox - Fr 20.12.02 10:23


Quelltext
1:
Label1.Caption := StringReplace(Edit1.Text, '0', '', [rfReplaceAll, rfIgnoreCase]);                    


Gruß,
Markus


Klabautermann - Fr 20.12.02 11:03

@DaFox: Das währe Fatal. Den deine Funktion verändert werte wenn z.B. 010 eingegeben wird kommt da 1 und nicht 10 raus. Es geht ja nur um führende Nullen.

@Jagg: Die Idee von Tino sollte dich zum Erfolg führen, aber du darfst die 0 nur dann löschen, wenn sie an erster Stelle gefunden wurde.

Gruß
Klabautermann


DaFox - Fr 20.12.02 11:12

Stimmt!

Da habe ich mich vom Titel ( :arrow: "herauschneiden" <> "*führende* Nullen entfernen") beirren lassen. Sorry.

Gruß,
Markus


Tino - Fr 20.12.02 11:28

Klabautermann hat folgendes geschrieben:
aber du darfst die 0 nur dann löschen, wenn sie an erster Stelle gefunden wurde.

Upps... ganz vergessen :oops:


hansa - Fr 20.12.02 11:42

Hi,


Quelltext
1:
2:
3:
if st <> '' then      // falls überhaupt etwas vorhanden ist
  while st [1] = '0' do 
     delete (st,1,1);


In der Kürze liegt die Würze !

Gruß
Hansa


Anonymous - Fr 20.12.02 12:22

hansa hat folgendes geschrieben:

Quelltext
1:
2:
3:
if st <> '' then      // falls überhaupt etwas vorhanden ist
  while st [1] = '0' do 
     delete (st,1,1);


In der Kürze liegt die Würze !

Hast irgendwie recht. Wenn St = '0' ist macht es bumm.

Gruß Tom


hansa - Fr 20.12.02 12:27

Hi Tom,

Zitat:
Hast irgendwie recht. Wenn St = '0' ist macht es bumm.

Was macht wo und wie Bumm :?:


Anonymous - Fr 20.12.02 12:31

hansa hat folgendes geschrieben:
Was macht wo und wie Bumm :?:

- Schleife mit '0' betreten
- 1. Durchlauf: St = ''
- 2. Durchlauf: Zugriff auf St[ 1 ]. Und das dürfte nicht gehen.

Gruß Tom


Jagg - Fr 20.12.02 12:47

so vllt ? :

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button2Click(Sender: TObject);
 var i : integer;
     s : string;
begin
  for i := 1 to Length(Edit1.Text) do
  begin
    if pos('0',Edit1.Text) <> 0 then
    begin
     Edit1.Text := s;
     Delete(s,3,1);
    end;
  end;
end;


hansa - Fr 20.12.02 12:55

Hi,

die if st <> '' - Abfrage braucht man auch nicht, so macht es nicht BUMM :

Quelltext
1:
2:
3:
  while st <> '' do
      IF st [1] = '0' then
       delete (st,1,1);

Warum schreibt Ihr eigentlich soviele Zeilen Code, wo ein Dreizeiler genügt ? :mrgreen:

Gruß
Hansa


Anonymous - Fr 20.12.02 13:01

hansa hat folgendes geschrieben:

Quelltext
1:
  while st <> '' do                    


Warum schreibt Ihr eigentlich soviele Zeilen Code, wo ein Dreizeiler genügt ? :mrgreen:

Jau ... es wird amüsant ... Wie lange läuft Deine Schleife wohl, wenn der Ausgangstext irgendeinen Buchstaben außer 0 enthält?

Die absturzsichere und kürzere Form Deines Quelltextes ist schlicht und ergreifend: St := '';
Aber das war irgendwie nicht der Sinn des Ganzen.

Gruß Tom


Jagg - Fr 20.12.02 13:06

hey leute ich habe ja gar keine peilung mehr
bin heute was neben mir !


Anonymous - Fr 20.12.02 13:06

Ich schlage mal vor:

Quelltext
1:
2:
While Pos( '0', St ) = 1 do Delete( St, 1, 1 );
If St = '' Then St := '0';

Gruß Tom


Jagg - Fr 20.12.02 13:15

was bedeutet das denn eigentlich pos('0',st) = 1 oder 0 oder <> 0 ?


hansa - Fr 20.12.02 13:16

Hi,

Zitat:
Jau ... es wird amüsant


Dem stimme ich zu. Dein Zweizeiler stimmt trotzdem nicht. :mrgreen:

Quelltext
1:
2:
While Pos( '0', St ) = 1 do Delete( St, 1, 1 ); 
If St = '' Then St := '0';


Wie wärs, wenn Du die beiden Zeilen vertauschst ? Glaube die zweite kann man sogar weglassen. :P

Gruß
Hansa


DaFox - Fr 20.12.02 13:19

Was für'n Thread. Schlauer Code wäre wohl angebrachter als schlaue Sprüche. :evil:

Hier wäre meine Lösung (inspired by hansa); nicht die einzig mögliche, aber ohne Fehlerquellen:


Quelltext
1:
2:
  while (st <> '') and (st[1] = '0') do
     delete (st,1,1);


Gruß,
Markus


Anonymous - Fr 20.12.02 13:23

hansa hat folgendes geschrieben:
Dein Zweizeiler stimmt trotzdem nicht. :mrgreen:

Das ist eine Aussage ohne Beweisführung ...

Zitat:
Wie wärs, wenn Du die beiden Zeilen vertauschst ?

Gibt keinen Sinn, da das Setzen von St = '0' in der nächsten Zeile gelöscht würde.

Zitat:
Glaube die zweite kann man sogar weglassen. :P

Wenn als Ergebnis auch ein leerer String erlaubt ist: ja. Da es um Zahlen geht, vermute ich mal: nein.

Gruß Tom


hansa - Fr 20.12.02 13:28

Hi,

DaFox hat folgendes geschrieben:
Was für'n Thread.


Ist doch lustig. Der Code müßte so gehen, aber um der Haarspalterei Genüge zu tun : Paß auf, daß der Compiler-Schalter "Boolsche Ausdrücke auswerten" richtig eingestellt ist. Wenn er den Ausdruck nämlich vollständig auswertet hast Du immer noch eine Endlosschleife.

Gruß
Hansa :dunce:


DaFox - Fr 20.12.02 13:29

Tom hat folgendes geschrieben:

Wenn als Ergebnis auch ein leerer String erlaubt ist: ja. Da es um Zahlen geht, vermute ich mal: nein.


Du hast ja recht, aber ist das hier ein Verhaltensforschungsboard? Ich mutmase hier nicht, sondern gebe Antworten auf die entsprechenden Fragen. Möchte jagg nur Zahlen als Ergebnis erhalten, so kann er wohl selbst aus einem leeren String eine '0' machen. So viel Verständnis traue ich jedem hier zu. Aus diesem Grunde ist hansas Ansatz der richtige, am besten mit meiner Verfeinerung 8)

Gruß,
Markus


Anonymous - Fr 20.12.02 13:30

DaFox hat folgendes geschrieben:
Schlauer Code wäre wohl angebrachter

Stimmt mein Code nicht?

Zitat:
aber ohne Fehlerquellen:

Vor dem Aufruf sollte man den Compilerschalter "Boolsche Ausdrücke vollständig" noch deaktivieren. Ansonsten kann es zu Komplikationen führen, wenn man die globalen Compilereinstellungen ändert.

Gruß Tom


hansa - Fr 20.12.02 13:37

Hi Tom,

hehe, da war ich aber schneller. Über unser 007 Problem gibt es jetzt wohl nichts mehr zu sagen. James Bond wäre ein trockener martini wohl lieber als dieses Thema hier.

Gruß
Hansa :rofl: