Prüfen, ob ein String eine Zahl sein könnte

Hallo,

ich möchte innerhalb eines Datasteps einen Variableninhalt dahingehen überprüfen, ob man den Inhalt (Text) in eine Zahl umwandeln könnte... In Excel wäre das soetwas wie =ISTZAHL(), =ISNUMBER().

Hintergrund:
1. Wenn Text eine Zahl sein könnte, dann auf neun Stellen vornullen.
-> '12345' wird zu '000012345' per put(input(Text, 9.), Z9.)
2. Text kann nicht ohne Fehler in eine Zahl umgewandelt werden
-> '111ABC777' bleibt unverändert

Hier im Forum hab ich nichts gefunden, wobei mir ein guter Suchbegriff aber auch nicht eingefallen ist... Kann mir jemand helfen?

Gruß,
Marco

SAS - RegEx

Hallo zusammen,

ich würde hier mit regulären Ausdrücken arbeiten.
Die Notation ist zwar am Anfang vielleicht etwas ungewöhnlich aber dafür die Funktionalität/Flexibiität deutlich höher.

Beispiel von Herrn Kneilmann hier mit RegEx:

/* Mit Regular Expressions */
data blabla (drop=_:);

/* So wird der RegEx-Ausdruck nur einmal compiliert. */
_patternID = prxparse('/\D\S/');
/* \D alles was keine Zahl ist UND
\S alles was kein Whitespace ist
*/

length Text1 $10;
Text1 ='12345';

_position=prxmatch(_patternID, Text1) ;

if (_position = 0) then zahl1=put(input(Text1, 9.), z9.);

put text1= zahl1= _position=;

length Text2 $10;
Text2 ='12X45';

_position = prxmatch(_patternID, Text2);

if (_position = 0) then zahl2=put(input(Text2, 9.), z9.);

put text2= zahl2= _position=;

run;

Viele Grüße
Tim_Taylor

P.S. ist glaube ich erst seit Version 9 verfügbar....

klappt gut unter SAS 9

Danke! Klappt unter SAS 9, allerdings brauche ich die Funktion unter SAS 8.2. Insofern zieht hier die "Kneilmann-Lösung" :-)

Reguläre Ausdrücke sind aber unterschätzt... ich muss mir die häufiger mal ins Gedächnis rufen :-)

Gruß aus Hamburg,
Marco Schmidt

Reguläre Ausdrücke

Hallo,
dem kann ich mich nur anschlißen: Reguläre Ausdrücke sind super!!
Und unter UNIX-Betriebssystemen (Solaris, AIX, HP-UX, Linux oder wie sie alle heißen) ein alter Hut, der nix-desto-trotz von mir intensiv genutzt wird (im Rahmen von UNIX-Shell-Scripten zur LOG-Analyse, zur Automatisierung von 1001-Sachen und und und).

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

String gleich Zahl

Hallo Marco,
es geht ganz einfach z.B. so:

data blabla;
length Text $10;
Text ='12345';
if kcompress(ktranslate(Text ,' ','0123456789')) eq '' then do; /* input() nur wenn OK */
Zahl = put(input(Text, 9.), z9.);
end;
put text= zahl=;
Text ='12X45';
if kcompress(ktranslate(Text ,' ','0123456789')) eq '' then do; /* input() nur wenn OK */
Zahl = put(input(Text, 9.), z9.);
end;
put text= zahl=;
run;

Viel Erfolg damit.

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Das klappt

Super! Vielen Dank.

Bei mir funktionieren zwar weder kcompress noch ktranslate aber nur mit compress und translate geht das super.

Vielen Dank dafür!

Unter SAS 8.2 sollten eigentlich auch die k-Funktionen klappen, aber tun sie nicht :-(

Gruß
Marco Schmidt

es geht auch einfacher

In SAS gibt es eine passende Funktion NOTDIGIT (http://support.sas.com/onlinedoc/913/getDoc/en/lrdict.hlp/a002194195.htm)

if notdigit(trimn(Text)) eq 0 then Text=put(input(Text, best.), Z9.);

falls in SAS 8.2 NOTDIGIT nicht gibt, kann man auch mit Funktion VERIFY arbeiten:

if verify(trimn(Text), '0123456789') eq 0 then Text=put(input(Text, best.), Z9.);

Viele Grüße
Waldemar