| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Prüfen ob Zahl (1972 mal gelesen)
|
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002
|
erstellt am: 21. Dez. 2005 16:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Lispler Habe diese Lisp zum Prüfen ob Zahl, beim ersten Beispiel funkt es. Aber beim zweiten nicht mehr habe keine Ahnung warum. Bitte um eure Hilfe. ---------------------------------------------------------------------- (defun str-zahl-am-ende (teststring / zaehler stringende zahl-am-ende) (setq zaehler 0) (while (numberp (read (setq stringende (substr teststring (- (strlen teststring) zaehler))))) (setq zahl-am-ende (read stringende)) (setq zaehler (1+ zaehler)) ) zahl-am-ende ) ---------------------------------------------------------------------- Beispiel 1 (setq txt "200.1/10") (setq umw (str-zahl-am-ende txt)) 10 Beispiel 2 (setq txt "200.1") (setq umw (str-zahl-am-ende txt)) ; Fehler: Falsch platzierter Punkt in Eingabe
------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 21. Dez. 2005 18:33 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
Hallo Heinz, könnte es sein, dass Du die nützlichen Debug-Funktionen der VLisp-IDE gar nicht benutzt? Solltest Du aber. Hier kannst Du nämlich 'ne ganze Menge über die Funktionsweise des Lisp-Interpreters lernen indem Du bestimmte Ausdrück überwachen läßt und Deine Proggies Schrittweise arbeiten läßt. Dann ist es auch überhaupt kein Problem für Dich herauszufinden was genau Deinen Fehler verursacht: (read ".1") Was genau soll denn Deine Funktion machen? Soll da am Ende 'n Integer oder Real rauskommen? Guck' Dir mal die hier an, ist nicht in jedem Fall passend aber na ja...:
Code:
(defun STR-ZAHL-AM-ENDE (STR / INDEX LIT RETVAL) (setq INDEX (strlen STR) RETVAL "" ) (while (> INDEX 0) (if (wcmatch (setq LIT (substr STR INDEX 1)) "0,1,2,3,4,5,6,7,8,9,`,,`.,+,-") (setq RETVAL (strcat LIT RETVAL) INDEX (1- INDEX) ) (setq INDEX 0) ) ) (read RETVAL) )
(str-zahl-am-ende "200.1/10") -> 10 (str-zahl-am-ende "200.1") -> 200.1 (str-zahl-am-ende "H100 /0.2 ") -> nil (Leerzeichen am Ende !) (str-zahl-am-ende "0.00000.2") -> 0 (Ist zwar Mist, geht aber ja auch Mist rein ;-))------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002
|
erstellt am: 21. Dez. 2005 19:10 <-- editieren / zitieren --> Unities abgeben:
@ Marc Das Lisp soll Prüfen ob die Strings eine Zahl sind. 200.1 sollte rauskommen 1 ist Zahl. 200.11 sollte rauskommen 11 ist zahl, die will ich dan um eins erhöhen. mit diesen Symbol geht es ja / aber mit Punkt habe ich ein Problem. bei 200/1 kommt dan 1 raus, die kann ich dan erhöhen.Wird dann 200/2 das funkt super so. danke für Antwort. ------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 21. Dez. 2005 20:00 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
na dann bastel Marcs Funktion entsprechen um: (defun STR-ZAHL-AM-ENDE (STR / INDEX LIT RETVAL) (setq INDEX (strlen STR) RETVAL "" ) (while (> INDEX 0) (if (< 47 (ascii(setq LIT (substr STR INDEX 1))) 58) (setq RETVAL (strcat LIT RETVAL) INDEX (1- INDEX) ) (setq INDEX 0) ) ) (read RETVAL) ) ich hab das statt wcmatch mal mit ascii gelöst .. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002
|
erstellt am: 21. Dez. 2005 20:14 <-- editieren / zitieren --> Unities abgeben:
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 22. Dez. 2005 10:43 <-- editieren / zitieren --> Unities abgeben: Nur für Dober Heinz
Zitat: Original erstellt von Dober Heinz: @ Thomas Danke dir das wars funkt super mfg
Der Vergleich der ASCII Codes von Cadmium war clever, besser geht es aber noch, wenn man mit Listen statt mit Strings arbeitet. Dann sieht das so aus: Code:
(defun STR-ZAHL-AM-ENDE (STR / retlst strlst) (setq strlst (reverse (vl-string->list str))) (while (and strlst (< 47 (car strlst) 58)) (setq retlst (cons (car strlst) retlst) strlst (cdr strlst) ) ) (read (vl-list->string retlst)) )
Wenn's die vl-string->list Funktion und die Umkehrung nicht gäbe, dann müsste man diese Funktionen natürlich schnell schreiben - das wären einfache Zweizeiler. Wenn Du das Ergebnis als String benötigst statt als Zahl, dann lässt Du bei der Rückgabe das "read" einfach weg. Tom Berger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dober Heinz Mitglied Technischer Zeichner
Beiträge: 1146 Registriert: 20.12.2002
|
erstellt am: 22. Dez. 2005 10:54 <-- editieren / zitieren --> Unities abgeben:
@ archtools Danke das funkt super. Bin gerade dabei von Zahl 200.10/1 die Zahl 10 um eines hochzählen, sollte dann so aussehn 200.11/1 funkt zwar schon bin aber dabei um es mit verschieden Zeichen auch zu machen das sind (. , / - _). mfg
------------------ Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |