Mercurial > hg > octave-terminal
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 +++ b/scripts/strings/str2num.m @@ -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);