WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Nur Zahleneingabe

 

Stefan2010

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2010, 21:41     Titel: Nur Zahleneingabe
  Antworten mit Zitat      
Hallo,
ich mache mit Matlab eine Eingabe die z.B. S=input ('Geben Sie bitte die Seillänge in m ein: >> ','s'); so aussieht. Nun würde ich gerne mit einer if else Funktion das so einrichten das man nur Zahlen eingeben kann. Wenn man Buchstaben eingibt soll kommen: Ungültige Eingabe und man soll das ganze nochmal eingeben.

Hoffe ihr versteht was ich meine. Weiss nicht wie ich es sonst beschreiben soll Smile

Würde mich über Hilfe freuen!

Danke schonmal

Grüße Stefan


Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 16.12.2010, 02:05     Titel:
  Antworten mit Zitat      
Hallo,

dieses Thema gab es schon einige mal, bitte das nächste mal die Forumsuche verwenden. Prinzipiell hilft dir der Befehl:
Code:

Beispiel siehe z.B. hier:
http://www.gomatlab.de/edit-eingabe.....ghlight,denny+regexp.html
http://www.gomatlab.de/eingabewerte.....ghlight,denny+regexp.html

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.12.2010, 04:37     Titel: Re: Nur Zahleneingabe
  Antworten mit Zitat      
Hallo Stefan,

Du könntest den String mit SSCANF in eine Zahl umwandeln lassen.
Das ignoriert zwar angehängte Buchstaben, z.B. in "3.14159265 Meter", aber ist es trotzdem benutzerfreundlich genug.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Stefan2010

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2010, 13:01     Titel:
  Antworten mit Zitat      
Danke euch schonmal für die antworten. Hatte auch den regexp Befehl gesehen, komme damit aber nicht klar. Ich würd gerne wissen wie der Quellcode aussehen muss vom regedit befehl das er alle positiven Zahlen annimmt, negative Zahlen und Buchstaben dagegen nicht annimmt.

Krieg das nicht auf die Reihe...

Danke schonmal
 
Stefan2010

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2010, 13:02     Titel:
  Antworten mit Zitat      
nicht regedit sondern regexp sorry...
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.12.2010, 14:04     Titel:
  Antworten mit Zitat      
Hallo

1) das habe ich bereits hier gezeigt, schau dazu die 2.Seite:
http://www.gomatlab.de/edit-eingabe.....enny+regexp,start,15.html

Code:

wert = input('Bitte eine positive Zahl eingeben: ','s');

ist_zahl = regexp(wert,'^[0-9]*(\.(\d)+)?([eE]([+-])?(\d)+)?$')
if ~isempty(ist_zahl)
  fprintf('Eine zulässige Zahl\n')
  wert=sscanf(wert, '%f');  
else
  fprintf('Keine zulässige Zahl\n')
  return;
end
 



2) Du kannst dir REGEXP aber auch sparen:
Rufe einfach INPUT ohne 2. Parameter auf.
INPUT wird dann nur die Zahlen akzeptieren.
Du musst dann bloß die Zahlen prüfen,
ob sie positiv oder negativ sind

Code:

wert = input('Bitte eine positive Zahl eingeben: ');


if wert>=0
  fprintf('Eine zulässige Zahl\n')
 else
  fprintf('Keine zulässige Zahl\n')
  return;
end
 


Zuletzt bearbeitet von denny am 16.12.2010, 19:10, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Stefan2010

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2010, 16:13     Titel:
  Antworten mit Zitat      
Danke Denny, aber ich will ja alle Zahlen zulassen. Lediglich bei Buchstaben soll dann kommen Ungültige Eingabe und die Eingabeaufforderung erneut gestellt werden.

Geht das mit dem Befehl auch ?
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 16.12.2010, 16:35     Titel:
  Antworten mit Zitat      
Hallo

Zitat:

INPUT wird dann nur die Zahlen akzeptieren.


Das steht doch eindeutig in dennys post, dass dann nur Zahlen akzeptiert werden.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 16.12.2010, 16:49     Titel:
  Antworten mit Zitat      
Stefan2010 hat Folgendes geschrieben:
Ich würd gerne wissen wie der Quellcode aussehen muss vom regedit befehl das er alle positiven Zahlen annimmt, negative Zahlen und Buchstaben dagegen nicht annimmt.


!=

Stefan2010 hat Folgendes geschrieben:

aber ich will ja alle Zahlen zulassen. Lediglich bei Buchstaben soll dann kommen Ungültige Eingabe und die Eingabeaufforderung erneut gestellt werden.


Was möchtest du denn jetzt? soll er ALLE Zahlen zulassen oder NUR POSITIVE?
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.12.2010, 19:27     Titel:
  Antworten mit Zitat      
Stefan2010 hat Folgendes geschrieben:
Danke Denny, aber ich will ja alle Zahlen zulassen. Lediglich bei Buchstaben soll dann kommen Ungültige Eingabe und die Eingabeaufforderung erneut gestellt werden.

Geht das mit dem Befehl auch ?


Natürlich geht das

Code:


while true
  wert = input('Bitte Zahl eingeben: ','s');


  ist_zahl = regexp(wert,'^[+-]?[0-9]*(\.(\d)+)?([eE]([+-])?(\d)+)?$');
  if ~isempty(ist_zahl)
    fprintf('Eine zulässige Zahl\n')
    wert=sscanf(wert, '%f');
    break;  
  else
    fprintf('Keine zulässige Zahl\n')  
  end
end
 





Oder nur mit INPUT:

Code:


while true
  try
   wert = input('Bitte Zahl eingeben: ');
   if isempty(wert)
     continue;
   end
   break;
  catch
    fprintf('Keine zulässige Zahl\n') ;
  end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Stefan2010

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2010, 21:55     Titel:
  Antworten mit Zitat      
Danke denny, das hat mir sehr geholfen, hab aber noch ein kleines Problem und zwar sieht das bei mir so aus :

Code:

disp('Eingabe der Seilparameter')
while true
  S = input('Geben Sie bitte die Seillänge in m ein: ','s');


  ist_zahl = regexp(S,'^[+-]?[0-9]*(\.(\d)+)?([eE]([+-])?(\d)+)?$| ^[0-9]\*10\^[0-9]$');
  if ~isempty(ist_zahl)
    fprintf('Gültige Eingabe\n')
    S=sscanf(S, '%f');
    break;  
  else
    fprintf('Ungültige Eingabe\n')  
  end
end
 

Er sagt auch wunder bei zahlen gültige eingabe und bei buchstaben ungü ltige eingabe und stellt die frage nochmal. Das Problem ist jetzt das er auch bei z.b. 2*10^5 oder e-funktionen Ungültige Eingabe sagt. Ich dachte das hätte ich oben bei regexp definiert ?!

Ich glaub ich bin zu blöd Sad

Danke schonmal.

Gruß
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.12.2010, 10:31     Titel:
  Antworten mit Zitat      
Hallo

da ist irgendwie ein Leerzeichen dazwischen reingerutscht und zwar zw. | und ^ Zeichen
Code:

ist_zahl = regexp(S,'^[+-]?[0-9]*(\.(\d)+)?([eE]([+-])?(\d)+)?$|^[0-9]\*10\^[0-9]$')
 


so sollte es funktionieren
Private Nachricht senden Benutzer-Profile anzeigen
 
Stefan2010

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2010, 18:41     Titel:
  Antworten mit Zitat      
Nochmals danke Denny, aber eingaben wie 10^2 funktionieren in der Abfrage weiterhin nicht. Vllt. hast du ja noch ne Idee Smile

Auf jedenfall Vielen Dank schonmal.

LG
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.12.2010, 19:37     Titel:
  Antworten mit Zitat      
Hallo Denny,

Code:
ist_zahl = regexp(S,'^[+-]?[0-9]*(\.(\d)+)?([eE]([+-])?(\d)+)?$|^[0-9]\*10\^[0-9]$')

Reguläre Ausdrücke sind wirklich hart. C-Code sieht ja schon aus, als hätte jemand ein wütendes Gürteltier über die Tastatur gerollt.

Offenbar hat Stefan aber trotz des sehr effizienten Ansatzes Schwierigkeiten damit. Das Parsen von Ausdrücken ist aber auch wirklich eine komplexe Arbeit.

Nun sind Strings wie "8.1 * 10^17" aber einfach keine regulären Zahlen in Matlab, sondern man muss "8.1e17" schreiben. Computer fordern leider einen gewissen Tribut durch hakelige Bedienbarkeit. Ein wirklich menschenfreundliches Interface wäre sowieso sprachgesteuert!

Ein im Vergleich zu REGEXP eher plumper SSCANF-Ansatz:
Code:

Str = input('Zahl eingebe: ', 's');
Str = deblank(s);
[N, Count, Msg, NextIndex] = sscanf(Str, '%g', 1);
if isempty(N) || NextIndex ~= length(Str) + 1
   % Failed
end
 

Das liest eine Zahl ein, ignoriert Spaces am Ende, und lehnt angehängte Buchstaben ab. "8.1e7" wird akzeptiert, "8.1 * 10^7" aber nicht. Auf einem Taschenrechner kann man soetwas aber auch nicht eingeben.

Eine Idee wäre es noch, den String per EVAL auszuwerten. Dann würde auch "sin(0.8)" funktionieren, und "!del *.*" ebenfalls. Das ist deswegen auch nicht gerade besser.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 05.04.2011, 21:04     Titel:
  Antworten mit Zitat      
Hallo,

ich spare mir mal die Eroeffnung eines neuen Threads und haenge meine Frage mal hier mit ran, da sie auch einen regulaeren Ausdruck betrifft. Ich moechte gern bei einer Zahleneingabe (editbox) den String ueberpruefen, ob er eine ganzzahlige Zahl zwischen 21 und 110 ist. Meine bisherige Loesung funktioniert zwar, jedoch bin ich ueberzeugt das dies auch kompakter und vor allem einfacher geht:
Code:

regexp(wert,'^[1][0][0-9]$|^[1][0][0]$|^[2][1-9]$|^[3-9][0-9]$')
% suche          100-109,       100,      21-29,      30-99
 

Ich waere allerdings dankbar, falls Loesungen ohne regexp gepostet werden, wenn mir jemand trotzdem den regulaeren Ausdruck zeigen koennte.

Vielen Dank

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.