annotate scripts/strings/str2double.m @ 5185:75a442ecd410

[project @ 2005-03-03 06:59:01 by jwe]
author jwe
date Thu, 03 Mar 2005 06:59:01 +0000
parents d35c5104ffbe
children e58bbd2b9c94
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
1 ## Copyright (C) 2004 by Alois Schloegl <a.schloegl@ieee.org>
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
2 ##
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
3 ## This file is part of Octave.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
4 ##
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
6 ## under the terms of the GNU General Public License as published by
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
7 ## the Free Software Foundation; either version 2, or (at your option)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
8 ## any later version.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
9 ##
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
13 ## General Public License for more details.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
14 ##
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
15 ## You should have received a copy of the GNU General Public License
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
16 ## along with Octave; see the file COPYING. If not, write to the Free
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
17 ## Software Foundation, 59 Temple Place - Suite 330, Boston, MA
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
18 ## 02111-1307, USA.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
19
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
20 ## STR2DOUBLE converts strings into numeric values
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
21 ## [NUM, STATUS,STRARRAY] = STR2DOUBLE(STR)
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
22 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
23 ## STR2DOUBLE can replace STR2NUM, but avoids the insecure use of EVAL
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
24 ## on unknown data [1].
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
25 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
26 ## STR can be the form '[+-]d[.]dd[[eE][+-]ddd]'
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
27 ## d can be any of digit from 0 to 9, [] indicate optional elements
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
28 ## NUM is the corresponding numeric value.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
29 ## if the conversion fails, status is -1 and NUM is NaN.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
30 ## STATUS = 0: conversion was successful
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
31 ## STATUS = -1: couldnot convert string into numeric value
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
32 ## STRARRAY is a cell array of strings.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
33 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
34 ## Elements which are not defined or not valid return NaN and
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
35 ## the STATUS becomes -1
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
36 ## STR can be also a character array or a cell array of strings.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
37 ## Then, NUM and STATUS return matrices of appropriate size.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
38 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
39 ## STR can also contain multiple elements.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
40 ## default row-delimiters are:
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
41 ## NEWLINE, CARRIAGE RETURN and SEMICOLON i.e. ASCII 10, 13 and 59.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
42 ## default column-delimiters are:
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
43 ## TAB, SPACE and COMMA i.e. ASCII 9, 32, and 44.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
44 ## default decimal delimiter is '.' char(46), sometimes (e.g in
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
45 ## Tab-delimited text files generated by Excel export in Europe)
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
46 ## might used ',' as decimal delimiter.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
47 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
48 ## [NUM, STATUS] = STR2DOUBLE(STR,CDELIM,RDELIM,DDELIM)
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
49 ## CDELIM .. [OPTIONAL] user-specified column delimiter
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
50 ## RDELIM .. [OPTIONAL] user-specified row delimiter
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
51 ## DDELIM .. [OPTIONAL] user-specified decimal delimiter
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
52 ## CDELIM, RDELIM and DDELIM must contain only
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
53 ## NULL, NEWLINE, CARRIAGE RETURN, SEMICOLON, COLON, SLASH, TAB, SPACE, COMMA, or ()[]{}
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
54 ## i.e. ASCII 0,9,10,11,12,13,14,32,33,34,40,41,44,47,58,59,91,93,123,124,125
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
55 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
56 ## Examples:
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
57 ## str2double('-.1e-5')
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
58 ## ans = -1.0000e-006
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
59 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
60 ## str2double('.314e1, 44.44e-1, .7; -1e+1')
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
61 ## ans =
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
62 ## 3.1400 4.4440 0.7000
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
63 ## -10.0000 NaN NaN
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
64 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
65 ## line ='200,300,400,NaN,-inf,cd,yes,no,999,maybe,NaN';
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
66 ## [x,status]=str2double(line)
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
67 ## x =
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
68 ## 200 300 400 NaN -Inf NaN NaN NaN 999 NaN NaN
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
69 ## status =
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
70 ## 0 0 0 0 0 -1 -1 -1 0 -1 0
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
71 ##
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
72 ## Reference(s):
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
73 ## [1] David A. Wheeler, Secure Programming for Linux and Unix HOWTO.
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
74 ## http://en.tldp.org/HOWTO/Secure-Programs-HOWTO/
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
75
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
76 function [num, status, strarray] = str2double (s, cdelim, rdelim, ddelim)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
77
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
78 FLAG_OCTAVE = exist('OCTAVE_VERSION','builtin');
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
79
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
80 ## digits, sign, exponent,NaN,Inf
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
81 ## valid_char = '0123456789eE+-.nNaAiIfF';
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
82
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
83 ## valid delimiters
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
84 valid_delim = char (sort ([0, 9:14, 32:34, abs("()[]{},;:\"|/")]));
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
85
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
86 if (nargin < 1)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
87 error ("missing input argument");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
88 endif
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
89
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
90 if (nargin < 2)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
91 ## column delimiter
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
92 cdelim = char ([9, 32, abs(",")]);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
93 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
94 ## make unique cdelim
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
95 cdelim = char (sort (cdelim(:)));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
96 tmp = [1; 1+find(diff(abs(cdelim))>0)];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
97 cdelim = cdelim(tmp)';
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
98 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
99
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
100 if (nargin < 3)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
101 ## row delimiter
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
102 rdelim = char ([0, 10, 13, abs(";")]);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
103 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
104 ## make unique rdelim
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
105 rdelim = char (sort (rdelim(:)));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
106 tmp = [1; 1+find(diff(abs(rdelim))>0)];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
107 rdelim = rdelim(tmp)';
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
108 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
109
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
110 if (nargin < 4)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
111 ddelim = '.';
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
112 elseif (length (ddelim) != 1)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
113 error ("decimal delimiter must be exactly one character");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
114 endif
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
115
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
116 ## check if RDELIM and CDELIM are distinct
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
117
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
118 delim = sort (abs ([cdelim, rdelim, ddelim]));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
119 tmp = [1, 1+find(diff(delim)>0)];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
120 delim = delim(tmp);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
121 ## [length(delim),length(cdelim),length(rdelim)]
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
122 if (length (delim) < (length(cdelim) + length(rdelim))+1)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
123 ## length (ddelim) must be one.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
124 error ("row, column and decimal delimiter are not distinct");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
125 endif
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
126
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
127 ## check if delimiters are valid
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
128 tmp = sort (abs ([cdelim, rdelim]));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
129 flag = zeros (size (tmp));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
130 k1 = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
131 k2 = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
132 while (k1 <= length (tmp) && k2 <= length (valid_delim)),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
133 if (tmp(k1) == valid_delim(k2))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
134 flag(k1) = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
135 k1++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
136 elseif (tmp(k1) < valid_delim(k2))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
137 k1++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
138 elseif (tmp(k1) > valid_delim(k2))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
139 k2++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
140 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
141 endwhile
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
142 if (! all (flag))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
143 error ("invalid delimiters!");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
144 endif
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
145
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
146 ## various input parameters
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
147
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
148 if (isnumeric (s))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
149 if (all (s < 256) && all (s >= 0))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
150 s = char (s);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
151 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
152 error ("str2double: input variable must be a string");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
153 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
154 endif
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
155
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
156 if (isempty (s))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
157 num = [];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
158 status = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
159 return;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
160 elseif (iscell (s))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
161 strarray = s;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
162 elseif (ischar (s) && all (size (s) > 1))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
163 ## char array transformed into a string.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
164 for k = 1:size (s, 1)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
165 tmp = find (! isspace (s(k,:)));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
166 strarray{k,1} = s(k,min(tmp):max(tmp));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
167 endfor
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
168 elseif (ischar (s)),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
169 num = [];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
170 status = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
171 strarray = {};
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
172 ## add stop sign; makes sure last digit is not skipped
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
173 s(end+1) = rdelim(1);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
174 RD = zeros (size (s));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
175 for k = 1:length (rdelim),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
176 RD = RD | (s == rdelim(k));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
177 endfor
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
178 CD = RD;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
179 for k = 1:length (cdelim),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
180 CD = CD | (s==cdelim(k));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
181 endfor
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
182
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
183 k1 = 1; # current row
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
184 k2 = 0; # current column
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
185 k3 = 0; # current element
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
186
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
187 sl = length (s);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
188 ix = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
189 ## while (ix < sl) & any(abs(s(ix))==[rdelim,cdelim]),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
190 while (ix < sl && CD(ix))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
191 ix++
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
192 endwhile
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
193 ta = ix;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
194 te = [];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
195 while (ix <= sl)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
196 if (ix == sl)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
197 te = sl;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
198 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
199 ## if any(abs(s(ix))==[cdelim(1),rdelim(1)]),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
200 if (CD(ix))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
201 te = ix - 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
202 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
203 if (! isempty (te))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
204 k2++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
205 k3++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
206 strarray{k1,k2} = s(ta:te);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
207 ## strarray{k1,k2} = [ta,te];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
208
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
209 flag = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
210 ## while any(abs(s(ix))==[cdelim(1),rdelim(1)]) & (ix < sl),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
211 while (CD(ix) && ix < sl)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
212 flag = flag | RD(ix);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
213 ix++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
214 endwhile
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
215
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
216 if (flag)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
217 k2 = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
218 k1++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
219 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
220 ta = ix;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
221 te = [];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
222 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
223 ix++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
224 endwhile
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
225 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
226 error ("str2double: invalid input argument");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
227 endif
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
228
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
229 [nr, nc]= size (strarray);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
230 status = zeros (nr, nc);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
231 num = repmat (NaN, nr, nc);
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
232
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
233 for k1 = 1:nr
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
234 for k2 = 1:nc
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
235 t = strarray{k1,k2};
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
236 if (length (t) == 0)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
237 ## return error code
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
238 status(k1,k2) = -1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
239 num(k1,k2) = NaN;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
240 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
241 ## get mantisse
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
242 g = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
243 v = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
244 if (t(1) == "-")
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
245 v = -1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
246 l = min (2, length(t));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
247 elseif (t(1) == "+")
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
248 l = min (2, length (t));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
249 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
250 l = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
251 endif
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
252
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
253 if (strcmpi (t(l:end), "inf"))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
254 num(k1,k2) = v*Inf;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
255 elseif (strcmpi (t(l:end), "NaN"));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
256 num(k1,k2) = NaN;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
257 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
258 if (ddelim == ".")
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
259 t(t==ddelim) = ".";
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
260 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
261 [v,tmp2,c] = sscanf(char(t), "%f %s", "C");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
262 ## [v,c,em,ni] = sscanf(char(t),"%f %s");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
263 ## c = c * (ni>length(t));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
264 if (c == 1),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
265 num(k1,k2) = v;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
266 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
267 num(k1,k2) = NaN;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
268 status(k1,k2) = -1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
269 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
270 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
271 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
272 endfor
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
273 endfor
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
274
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
275 endfunction