changeset 13178:89fb0e668825

str2num.m: Use more modern code practices * str2num.m: Put input validation first and expand error message. Add new input validation test. Update docstring.
author Rik <octave@nomad.inbox5.com>
date Tue, 20 Sep 2011 16:08:53 -0700
parents 17b702fae303
children 8c4a2c2cc2b0
files scripts/strings/str2num.m
diffstat 1 files changed, 28 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/strings/str2num.m	Tue Sep 20 15:51:20 2011 -0700
+++ b/scripts/strings/str2num.m	Tue Sep 20 16:08:53 2011 -0700
@@ -17,7 +17,7 @@
 ## <http://www.gnu.org/licenses/>.
 
 ## -*- texinfo -*-
-## @deftypefn {Function File} {@var{x} =} str2num (@var{s})
+## @deftypefn  {Function File} {@var{x} =} str2num (@var{s})
 ## @deftypefnx {Function File} {[@var{x}, @var{state}] =} str2num (@var{s})
 ## Convert the string (or character array) @var{s} to a number (or an
 ## array).  Examples:
@@ -35,13 +35,15 @@
 ## @end example
 ##
 ## The optional second output, @var{state}, is logically true when the
-## coversion is successful. If the conversion fails the numeric output,
+## coversion is successful.  If the conversion fails the numeric output,
 ## @var{x}, is empty and @var{state} is false.
 ##
 ## @strong{Caution:} As @code{str2num} uses the @code{eval} function
 ## to do the conversion, @code{str2num} will execute any code contained
 ## in the string @var{s}.  Use @code{str2double} for a safer and faster
 ## conversion.
+##
+## For cell array of strings use @code{str2double}.  
 ## @seealso{str2double, eval}
 ## @end deftypefn
 
@@ -49,31 +51,37 @@
 
 function [m, state] = str2num (s)
 
-  if (nargin == 1 && ischar (s))
-    [nr, nc] = size (s);
-    sep = ";";
-    sep = sep (ones (nr, 1), 1);
-    s = sprintf ("m = [%s];", reshape ([s, sep]', 1, nr * (nc + 1)));
-    state = true;
-    eval (s, "m = []; state = false;");
-    if (ischar (m))
-      m = [];
-      state = false;
-    endif
-  else
+  if (nargin != 1) 
     print_usage ();
   endif
+  
+  if (! ischar (s))
+    error ("str2num: S must be a string or string array");
+  endif
+
+  [nr, nc] = size (s);
+  sep = repmat (";", nr, 1);
+  s = sprintf ("m = [%s];", reshape ([s, sep]', 1, nr * (nc + 1)));
+  state = true;
+  eval (s, "m = []; state = false;");
+  if (ischar (m))
+    m = [];
+    state = false;
+  endif
 
 endfunction
 
-%!assert(str2num ("-1.3e2") == -130 && str2num ("[1, 2; 3, 4]") == [1, 2; 3, 4]);
+
+%!assert(str2num ("-1.3e2"), -130);
+%!assert(str2num ("[1, 2; 3, 4]"), [1, 2; 3, 4]);
 
-%!error str2num ();
-
-%!error str2num ("string", 1);
+%% Test input validation
+%!error str2num ()
+%!error str2num ("string", 1)
+%!error str2num ({"string"})
 
 %!test
 %! [x, state] = str2num ("pi");
-%! assert (state)
+%! assert (state);
 %! [x, state] = str2num (tmpnam);
-%! assert (! state)
+%! assert (! state);