Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Prüfen ob Zahl

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Prüfen ob Zahl (1842 mal gelesen)
Dober Heinz
Mitglied
Technischer Zeichner


Sehen Sie sich das Profil von Dober Heinz an!   Senden Sie eine Private Message an Dober Heinz  Schreiben Sie einen Gästebucheintrag für Dober Heinz

Beiträge: 1143
Registriert: 20.12.2002

erstellt am: 21. Dez. 2005 16:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

Beiträge: 2490
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dober Heinz 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Dober Heinz an!   Senden Sie eine Private Message an Dober Heinz  Schreiben Sie einen Gästebucheintrag für Dober Heinz

Beiträge: 1143
Registriert: 20.12.2002

erstellt am: 21. Dez. 2005 19:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

@ 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




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 21. Dez. 2005 20:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dober Heinz 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Dober Heinz an!   Senden Sie eine Private Message an Dober Heinz  Schreiben Sie einen Gästebucheintrag für Dober Heinz

Beiträge: 1143
Registriert: 20.12.2002

erstellt am: 21. Dez. 2005 20:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

@ Thomas
Danke dir das wars
funkt super
mfg

------------------
Heinz 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 22. Dez. 2005 10:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Dober Heinz 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Dober Heinz an!   Senden Sie eine Private Message an Dober Heinz  Schreiben Sie einen Gästebucheintrag für Dober Heinz

Beiträge: 1143
Registriert: 20.12.2002

erstellt am: 22. Dez. 2005 10:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

@ 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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz