Mercurial > hg > octave-nkf
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 |