| Autor |
Beitrag |
Jagg
      
Beiträge: 635
|
Verfasst: Fr 20.12.02 10:16
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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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
      
Beiträge: 189
|
Verfasst: Fr 20.12.02 10:23
Quelltext 1:
| Label1.Caption := StringReplace(Edit1.Text, '0', '', [rfReplaceAll, rfIgnoreCase]); |
Gruß,
Markus
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
      
Beiträge: 189
|
Verfasst: Fr 20.12.02 11:12
Stimmt!
Da habe ich mich vom Titel (  "herauschneiden" <> "*führende* Nullen entfernen") beirren lassen. Sorry.
Gruß,
Markus
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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 
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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 
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 635
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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 ?
Gruß
Hansa
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: Fr 20.12.02 13:01
| hansa hat folgendes geschrieben: | Quelltext
Warum schreibt Ihr eigentlich soviele Zeilen Code, wo ein Dreizeiler genügt ? |
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 
      
Beiträge: 635
|
Verfasst: Fr 20.12.02 13:06
hey leute ich habe ja gar keine peilung mehr
bin heute was neben mir !
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 635
|
Verfasst: Fr 20.12.02 13:15
was bedeutet das denn eigentlich pos('0',st) = 1 oder 0 oder <> 0 ?
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 20.12.02 13:16
Hi,
| Zitat: | | Jau ... es wird amüsant |
Dem stimme ich zu. Dein Zweizeiler stimmt trotzdem nicht.
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.
Gruß
Hansa
|
|
DaFox
      
Beiträge: 189
|
Verfasst: Fr 20.12.02 13:19
Was für'n Thread. Schlauer Code wäre wohl angebrachter als schlaue Sprüche.
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
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: Fr 20.12.02 13:23
| hansa hat folgendes geschrieben: | Dein Zweizeiler stimmt trotzdem nicht. |
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. |
Wenn als Ergebnis auch ein leerer String erlaubt ist: ja. Da es um Zahlen geht, vermute ich mal: nein.
Gruß Tom
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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 
|
|