]> Creatis software - CreaPhase.git/blobdiff - octave_packages/m/general/int2str.m
update packages
[CreaPhase.git] / octave_packages / m / general / int2str.m
diff --git a/octave_packages/m/general/int2str.m b/octave_packages/m/general/int2str.m
new file mode 100644 (file)
index 0000000..b80fae7
--- /dev/null
@@ -0,0 +1,122 @@
+## Copyright (C) 1993-2012 John W. Eaton
+##
+## This file is part of Octave.
+##
+## Octave is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or (at
+## your option) any later version.
+##
+## Octave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Octave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} int2str (@var{n})
+## Convert an integer (or array of integers) to a string (or a character
+## array).
+##
+## @example
+## @group
+## int2str (123)
+##      @result{} "123"
+##
+## s = int2str ([1, 2, 3; 4, 5, 6])
+##      @result{} s =
+##         1  2  3
+##         4  5  6
+##
+## whos s
+##      @result{} s =
+##       Attr Name        Size                     Bytes  Class
+##       ==== ====        ====                     =====  =====
+##            s           2x7                         14  char
+## @end group
+## @end example
+##
+## This function is not very flexible.  For better control over the
+## results, use @code{sprintf} (@pxref{Formatted Output}).
+## @seealso{sprintf, num2str, mat2str}
+## @end deftypefn
+
+## Author: jwe
+
+function retval = int2str (n)
+
+  if (nargin != 1)
+    print_usage ();
+  endif
+
+  if (isempty (n))
+    retval = '';
+    return;
+  endif
+
+  n = round (real(n));
+  sz = size(n);
+  nd = ndims (n);
+  nc = columns (n);
+  if (nc > 1)
+    idx = repmat ({':'}, nd, 1);
+    idx(2) = 1;
+    ifmt = get_fmt (n(idx{:}), 0);
+    idx(2) = 2:sz(2);
+    rfmt = get_fmt (n(idx{:}), 2);
+    fmt = cstrcat (ifmt, repmat (rfmt, 1, nc-1), "\n");
+  else
+    fmt = cstrcat (get_fmt (n, 0), "\n");
+  endif
+  tmp = sprintf (fmt, permute (n, [2, 1, 3 : nd]));
+  tmp(end) = "";
+  retval = char (strsplit (tmp, "\n"));
+
+endfunction
+
+function fmt = get_fmt (x, sep)
+
+  t = x(:);
+  t = t(t != 0);
+  if (isempty (t))
+    ## All zeros.
+    fmt = sprintf ("%%%dd", 1 + sep);
+  else
+    ## Maybe have some zeros.
+    nan_inf = isinf (t) | isnan (t);
+    if (any (nan_inf))
+      if (any (t(nan_inf) < 0))
+        min_fw = 4 + sep;
+      else
+        min_fw = 3 + sep;
+      endif
+    else
+      min_fw = 1 + sep;
+    endif
+    t = t(! nan_inf);
+    if (isempty (t))
+      ## Only zeros, Inf, and NaN.
+      fmt = sprintf ("%%%dd", min_fw);
+    else
+      ## Could have anything.
+      tfw = floor (log10 (double (abs (t)))) + 1 + sep;
+      fw = max (tfw);
+      if (any (t(tfw == fw) < 0))
+        fw++;
+      endif
+      fmt = sprintf ("%%%dd", max (fw, min_fw));
+    endif
+  endif
+
+endfunction
+
+%!assert (strcmp (int2str (-123), "-123") && strcmp (int2str (1.2), "1"));
+%!assert (all (int2str ([1, 2, 3; 4, 5, 6]) == ["1  2  3";"4  5  6"]));
+%!assert (int2str([]), "");
+
+%!error int2str ();
+%!error int2str (1, 2);
+