why does str2num create a figure?

I am using the property that str2num(string) returns an empty when the string is not solely made of numbers. In my case, I want to ignore the lines of my file that are not numers only so if ~isempty(str2num(fgetl(fid))) do something. However, a window popped up. It turns out "lines 42" - an entry in my file - caused this. Upon looking into it, I found
str2num('lines 1') or variations pop up a figure window; str2num('line') actually draws a line from (0,0) to (1,1). Also, str2num('lines') returns a matrix of values.
Why? And moreover, is there a workaround or a function I can use instead?

1 comentario

Jan
Jan el 16 de Feb. de 2012
Thanks for pointing to this old problem.

Iniciar sesión para comentar.

 Respuesta aceptada

Jan
Jan el 16 de Feb. de 2012

0 votos

STR2NUM uses eval to get the numerical contents of a string. If the string contains a Matlab command like line, it is evaluated with the obeserved side-effects. This is explained in the documentation, see help str2num. There you find the recommendation to use str2double to avoid this. In addition you can use sscanf also, but this accepts lines like "3.14 dummy" also by ignoring everything behind the valid number.

1 comentario

Andreas Goser
Andreas Goser el 16 de Feb. de 2012
The published MathWorks solution can be found here: http://www.mathworks.de/support/solutions/en/data/1-2ED43R/index.html

Iniciar sesión para comentar.

Más respuestas (1)

Pepijn
Pepijn el 16 de Feb. de 2012

0 votos

Thanks Jan!
Str2double doens't really do the job either since it isn't converting multiple entries, str2double('1 2') gives NaN. So I'll stick with the workaround below.
Workaround: using an "if sum(isletter(string))==0, do something", first.

3 comentarios

Jan
Jan el 16 de Feb. de 2012
This is neither a bug nor an easteregg, but the expected behaviour. It might even be useful for situations like: "str2num('sin(1)')". But it can even be dangerous, e.g. if your file contains a line like "!format C:" or "!del *.* \S". Even a "clear" might be very confusing for your function.
Walter Roberson
Walter Roberson el 16 de Feb. de 2012
str2double(regexp(string, 'split'))
Jan
Jan el 16 de Feb. de 2012
@Pepijn: Nicer: "if ~any(isletter(string))". But this check fails for "1.0e1" and "-.-.9-8.67-87.678".
What is is desired reply for "1 2"? When I expect the user to insert a number, NaN is a very useful answer.

Iniciar sesión para comentar.

Categorías

Más información sobre Data Type Conversion en Centro de ayuda y File Exchange.

Preguntada:

el 16 de Feb. de 2012

Editada:

Jan
el 14 de Oct. de 2013

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by