comparison scripts/strings/str2double.m @ 8506:bc982528de11

comment style fixes
author John W. Eaton <jwe@octave.org>
date Tue, 13 Jan 2009 11:56:00 -0500
parents 502e58a0d44f
children cadc73247d65
comparison
equal deleted inserted replaced
8505:124dd27bedae 8506:bc982528de11
85 function [num, status, strarray] = str2double (s, cdelim, rdelim, ddelim) 85 function [num, status, strarray] = str2double (s, cdelim, rdelim, ddelim)
86 86
87 ## digits, sign, exponent,NaN,Inf 87 ## digits, sign, exponent,NaN,Inf
88 ## valid_char = '0123456789eE+-.nNaAiIfF'; 88 ## valid_char = '0123456789eE+-.nNaAiIfF';
89 89
90 ## valid delimiters 90 ## Valid delimiters.
91 valid_delim = char (sort ([0, 9:14, 32:34, abs("()[]{},;:\"|/")])); 91 valid_delim = char (sort ([0, 9:14, 32:34, abs("()[]{},;:\"|/")]));
92 92
93 if (nargin < 1 || nargin > 4) 93 if (nargin < 1 || nargin > 4)
94 print_usage (); 94 print_usage ();
95 endif 95 endif
96 96
97 if (nargin < 2) 97 if (nargin < 2)
98 ## column delimiter 98 ## Column delimiter.
99 cdelim = char ([9, 32, abs(",")]); 99 cdelim = char ([9, 32, abs(",")]);
100 else 100 else
101 ## make unique cdelim 101 ## Make unique cdelim.
102 cdelim = char (sort (cdelim(:))); 102 cdelim = char (sort (cdelim(:)));
103 tmp = [1; 1+find(diff(abs(cdelim))>0)]; 103 tmp = [1; 1+find(diff(abs(cdelim))>0)];
104 cdelim = cdelim(tmp)'; 104 cdelim = cdelim(tmp)';
105 endif 105 endif
106 106
107 if (nargin < 3) 107 if (nargin < 3)
108 ## row delimiter 108 ## Row delimiter.
109 rdelim = char ([0, 10, 13, abs(";")]); 109 rdelim = char ([0, 10, 13, abs(";")]);
110 else 110 else
111 ## make unique rdelim 111 ## Make unique rdelim.
112 rdelim = char (sort (rdelim(:))); 112 rdelim = char (sort (rdelim(:)));
113 tmp = [1; 1+find(diff(abs(rdelim))>0)]; 113 tmp = [1; 1+find(diff(abs(rdelim))>0)];
114 rdelim = rdelim(tmp)'; 114 rdelim = rdelim(tmp)';
115 endif 115 endif
116 116
118 ddelim = "."; 118 ddelim = ".";
119 elseif (length (ddelim) != 1) 119 elseif (length (ddelim) != 1)
120 error ("decimal delimiter must be exactly one character"); 120 error ("decimal delimiter must be exactly one character");
121 endif 121 endif
122 122
123 ## check if RDELIM and CDELIM are distinct 123 ## Check if RDELIM and CDELIM are distinct.
124 124
125 delim = sort (abs ([cdelim, rdelim, ddelim])); 125 delim = sort (abs ([cdelim, rdelim, ddelim]));
126 tmp = [1, 1+find(diff(delim)>0)]; 126 tmp = [1, 1+find(diff(delim)>0)];
127 delim = delim(tmp); 127 delim = delim(tmp);
128 ## [length(delim),length(cdelim),length(rdelim)] 128 ## [length(delim),length(cdelim),length(rdelim)]
129 if (length (delim) < (length(cdelim) + length(rdelim))+1) 129 if (length (delim) < (length(cdelim) + length(rdelim))+1)
130 ## length (ddelim) must be one. 130 ## length (ddelim) must be one.
131 error ("row, column and decimal delimiter are not distinct"); 131 error ("row, column and decimal delimiter are not distinct");
132 endif 132 endif
133 133
134 ## check if delimiters are valid 134 ## Check if delimiters are valid.
135 tmp = sort (abs ([cdelim, rdelim])); 135 tmp = sort (abs ([cdelim, rdelim]));
136 flag = zeros (size (tmp)); 136 flag = zeros (size (tmp));
137 k1 = 1; 137 curr_row = 1;
138 k2 = 1; 138 curr_col = 1;
139 while (k1 <= length (tmp) && k2 <= length (valid_delim)), 139 while (curr_row <= length (tmp) && curr_col <= length (valid_delim)),
140 if (tmp(k1) == valid_delim(k2)) 140 if (tmp(curr_row) == valid_delim(curr_col))
141 flag(k1) = 1; 141 flag(curr_row) = 1;
142 k1++; 142 curr_row++;
143 elseif (tmp(k1) < valid_delim(k2)) 143 elseif (tmp(curr_row) < valid_delim(curr_col))
144 k1++; 144 curr_row++;
145 elseif (tmp(k1) > valid_delim(k2)) 145 elseif (tmp(curr_row) > valid_delim(curr_col))
146 k2++; 146 curr_col++;
147 endif 147 endif
148 endwhile 148 endwhile
149 if (! all (flag)) 149 if (! all (flag))
150 error ("invalid delimiters!"); 150 error ("invalid delimiters!");
151 endif 151 endif
152 152
153 ## various input parameters 153 ## Various input parameters.
154 154
155 if (isnumeric (s)) 155 if (isnumeric (s))
156 if (all (s < 256) && all (s >= 0)) 156 if (all (s < 256) && all (s >= 0))
157 s = char (s); 157 s = char (s);
158 else 158 else
165 status = 0; 165 status = 0;
166 return; 166 return;
167 elseif (iscell (s)) 167 elseif (iscell (s))
168 strarray = s; 168 strarray = s;
169 elseif (ischar (s) && all (size (s) > 1)) 169 elseif (ischar (s) && all (size (s) > 1))
170 ## char array transformed into a string. 170 ## Char array transformed into a string.
171 for k = 1:size (s, 1) 171 for k = 1:size (s, 1)
172 tmp = find (! isspace (s(k,:))); 172 tmp = find (! isspace (s(k,:)));
173 strarray{k,1} = s(k,min(tmp):max(tmp)); 173 strarray{k,1} = s(k,min(tmp):max(tmp));
174 endfor 174 endfor
175 elseif (ischar (s)), 175 elseif (ischar (s)),
176 num = []; 176 num = [];
177 status = 0; 177 status = 0;
178 strarray = {}; 178 strarray = {};
179 ## add stop sign; makes sure last digit is not skipped 179 ## Add stop sign; makes sure last digit is not skipped.
180 s(end+1) = rdelim(1); 180 s(end+1) = rdelim(1);
181 RD = zeros (size (s)); 181 RD = zeros (size (s));
182 for k = 1:length (rdelim), 182 for k = 1:length (rdelim),
183 RD = RD | (s == rdelim(k)); 183 RD = RD | (s == rdelim(k));
184 endfor 184 endfor
185 CD = RD; 185 CD = RD;
186 for k = 1:length (cdelim), 186 for k = 1:length (cdelim),
187 CD = CD | (s==cdelim(k)); 187 CD = CD | (s==cdelim(k));
188 endfor 188 endfor
189 189
190 k1 = 1; # current row 190 curr_row = 1;
191 k2 = 0; # current column 191 curr_col = 0;
192 k3 = 0; # current element 192 curr_elt = 0;
193 193
194 sl = length (s); 194 sl = length (s);
195 ix = 1; 195 ix = 1;
196 ## while (ix < sl) & any(abs(s(ix))==[rdelim,cdelim]), 196 ## while (ix < sl) & any(abs(s(ix))==[rdelim,cdelim]),
197 while (ix < sl && CD(ix)) 197 while (ix < sl && CD(ix))
206 ## if any(abs(s(ix))==[cdelim(1),rdelim(1)]), 206 ## if any(abs(s(ix))==[cdelim(1),rdelim(1)]),
207 if (CD(ix)) 207 if (CD(ix))
208 te = ix - 1; 208 te = ix - 1;
209 endif 209 endif
210 if (! isempty (te)) 210 if (! isempty (te))
211 k2++; 211 curr_col++;
212 k3++; 212 curr_elt++;
213 strarray{k1,k2} = s(ta:te); 213 strarray{curr_row,curr_col} = s(ta:te);
214 ## strarray{k1,k2} = [ta,te]; 214 ## strarray{curr_row,curr_col} = [ta,te];
215 215
216 flag = 0; 216 flag = 0;
217 ## while any(abs(s(ix))==[cdelim(1),rdelim(1)]) & (ix < sl), 217 ## while any(abs(s(ix))==[cdelim(1),rdelim(1)]) & (ix < sl),
218 while (CD(ix) && ix < sl) 218 while (CD(ix) && ix < sl)
219 flag = flag | RD(ix); 219 flag = flag | RD(ix);
220 ix++; 220 ix++;
221 endwhile 221 endwhile
222 222
223 if (flag) 223 if (flag)
224 k2 = 0; 224 curr_col = 0;
225 k1++; 225 curr_row++;
226 endif 226 endif
227 ta = ix; 227 ta = ix;
228 te = []; 228 te = [];
229 endif 229 endif
230 ix++; 230 ix++;
235 235
236 [nr, nc]= size (strarray); 236 [nr, nc]= size (strarray);
237 status = zeros (nr, nc); 237 status = zeros (nr, nc);
238 num = repmat (NaN, nr, nc); 238 num = repmat (NaN, nr, nc);
239 239
240 for k1 = 1:nr 240 for curr_row = 1:nr
241 for k2 = 1:nc 241 for curr_col = 1:nc
242 t = strarray{k1,k2}; 242 t = strarray{curr_row,curr_col};
243 if (length (t) == 0) 243 if (length (t) == 0)
244 ## return error code 244 ## Return error code.
245 status(k1,k2) = -1; 245 status(curr_row,curr_col) = -1;
246 num(k1,k2) = NaN; 246 num(curr_row,curr_col) = NaN;
247 else 247 else
248 ## get mantisse 248 ## Get mantisse.
249 g = 0; 249 g = 0;
250 v = 1; 250 v = 1;
251 if (t(1) == "-") 251 if (t(1) == "-")
252 v = -1; 252 v = -1;
253 l = min (2, length(t)); 253 l = min (2, length(t));
256 else 256 else
257 l = 1; 257 l = 1;
258 endif 258 endif
259 259
260 if (strcmpi (t(l:end), "inf")) 260 if (strcmpi (t(l:end), "inf"))
261 num(k1,k2) = v*Inf; 261 num(curr_row,curr_col) = v*Inf;
262 elseif (strcmpi (t(l:end), "NaN")); 262 elseif (strcmpi (t(l:end), "NaN"));
263 num(k1,k2) = NaN; 263 num(curr_row,curr_col) = NaN;
264 else 264 else
265 if (ddelim == ".") 265 if (ddelim == ".")
266 t(t==ddelim) = "."; 266 t(t==ddelim) = ".";
267 endif 267 endif
268 [v, tmp2, c] = sscanf(char(t), "%f %s", "C"); 268 [v, tmp2, c] = sscanf(char(t), "%f %s", "C");
269 ## [v,c,em,ni] = sscanf(char(t),"%f %s"); 269 ## [v,c,em,ni] = sscanf(char(t),"%f %s");
270 ## c = c * (ni>length(t)); 270 ## c = c * (ni>length(t));
271 if (c == 1), 271 if (c == 1),
272 num(k1,k2) = v; 272 num(curr_row,curr_col) = v;
273 else 273 else
274 num(k1,k2) = NaN; 274 num(curr_row,curr_col) = NaN;
275 status(k1,k2) = -1; 275 status(curr_row,curr_col) = -1;
276 endif 276 endif
277 endif 277 endif
278 endif 278 endif
279 endfor 279 endfor
280 endfor 280 endfor