@@ -122,28 +122,27 @@ Leading and trailing whitespace are ignored.
122
122
123
123
Parameters:
124
124
125
- num - A string, possibly empty.
125
+ num - A string
126
126
127
127
Returns:
128
128
129
- <NaN> If the string did not represent a valid number.
130
- Otherwise, the floating-point number represented [num].
129
+ none if the string did not represent a valid number.
130
+ Otherwise, some(n) where n is the floating-point
131
+ number represented by [num].
131
132
*/
132
- fn from_str ( num : str ) -> float {
133
- let num = str:: trim ( num) ;
134
-
133
+ fn from_str ( num : str ) -> option < float > {
135
134
let pos = 0 u; //Current byte position in the string.
136
135
//Used to walk the string in O(n).
137
136
let len = str:: len_bytes ( num) ; //Length of the string, in bytes.
138
137
139
- if len == 0 u { ret 0. ; }
138
+ if len == 0 u { ret none ; }
140
139
let total = 0 f; //Accumulated result
141
140
let c = 'z' ; //Latest char.
142
141
143
142
//The string must start with one of the following characters.
144
143
alt str:: char_at ( num, 0 u) {
145
144
'-' | '+' | '0' to '9' | '.' { }
146
- _ { ret NaN ; }
145
+ _ { ret none ; }
147
146
}
148
147
149
148
//Determine if first char is '-'/'+'. Set [pos] and [neg] accordingly.
@@ -173,7 +172,7 @@ fn from_str(num: str) -> float {
173
172
break ;
174
173
}
175
174
_ {
176
- ret NaN ;
175
+ ret none ;
177
176
}
178
177
}
179
178
}
@@ -193,7 +192,7 @@ fn from_str(num: str) -> float {
193
192
break ;
194
193
}
195
194
_ {
196
- ret NaN ;
195
+ ret none ;
197
196
}
198
197
}
199
198
}
@@ -238,17 +237,17 @@ fn from_str(num: str) -> float {
238
237
total = total * multiplier;
239
238
}
240
239
} else {
241
- ret NaN ;
240
+ ret none ;
242
241
}
243
242
}
244
243
245
244
if ( pos < len) {
246
- ret NaN ;
245
+ ret none ;
247
246
} else {
248
247
if ( neg) {
249
248
total *= -1 f;
250
249
}
251
- ret total;
250
+ ret some ( total) ;
252
251
}
253
252
}
254
253
@@ -291,39 +290,36 @@ fn pow_uint_to_uint_as_float(x: uint, pow: uint) -> float {
291
290
292
291
#[ test]
293
292
fn test_from_str ( ) {
294
- assert ( from_str ( "3" ) == 3. ) ;
295
- assert ( from_str ( " 3 " ) == 3. ) ;
296
- assert ( from_str ( "3.14" ) == 3.14 ) ;
297
- assert ( from_str ( "+3.14" ) == 3.14 ) ;
298
- assert ( from_str ( "-3.14" ) == -3.14 ) ;
299
- assert ( from_str ( "2.5E10" ) == 25000000000. ) ;
300
- assert ( from_str ( "2.5e10" ) == 25000000000. ) ;
301
- assert ( from_str ( "25000000000.E-10" ) == 2.5 ) ;
302
- assert ( from_str ( "" ) == 0. ) ;
303
- assert ( from_str ( "." ) == 0. ) ;
304
- assert ( from_str ( ".e1" ) == 0. ) ;
305
- assert ( from_str ( ".e-1" ) == 0. ) ;
306
- assert ( from_str ( "5." ) == 5. ) ;
307
- assert ( from_str ( ".5" ) == 0.5 ) ;
308
- assert ( from_str ( "0.5" ) == 0.5 ) ;
309
- assert ( from_str ( "0.5 " ) == 0.5 ) ;
310
- assert ( from_str ( " 0.5 " ) == 0.5 ) ;
311
- assert ( from_str ( " -.5 " ) == -0.5 ) ;
312
- assert ( from_str ( " -.5 " ) == -0.5 ) ;
313
- assert ( from_str ( " -5 " ) == -5. ) ;
314
-
315
- assert ( is_NaN ( from_str ( "x" ) ) ) ;
316
- assert ( from_str ( " " ) == 0. ) ;
317
- assert ( from_str ( " " ) == 0. ) ;
318
- assert ( from_str ( " 0.5" ) == 0.5 ) ;
319
- assert ( from_str ( " 0.5 " ) == 0.5 ) ;
320
- assert ( from_str ( " .1 " ) == 0.1 ) ;
321
- assert ( is_NaN ( from_str ( "e" ) ) ) ;
322
- assert ( is_NaN ( from_str ( "E" ) ) ) ;
323
- assert ( is_NaN ( from_str ( "E1" ) ) ) ;
324
- assert ( is_NaN ( from_str ( "1e1e1" ) ) ) ;
325
- assert ( is_NaN ( from_str ( "1e1.1" ) ) ) ;
326
- assert ( is_NaN ( from_str ( "1e1-1" ) ) ) ;
293
+ assert from_str ( "3" ) == some ( 3. ) ;
294
+ assert from_str ( "3" ) == some ( 3. ) ;
295
+ assert from_str ( "3.14" ) == some ( 3.14 ) ;
296
+ assert from_str ( "+3.14" ) == some ( 3.14 ) ;
297
+ assert from_str ( "-3.14" ) == some ( -3.14 ) ;
298
+ assert from_str ( "2.5E10" ) == some ( 25000000000. ) ;
299
+ assert from_str ( "2.5e10" ) == some ( 25000000000. ) ;
300
+ assert from_str ( "25000000000.E-10" ) == some ( 2.5 ) ;
301
+ assert from_str ( "." ) == some ( 0. ) ;
302
+ assert from_str ( ".e1" ) == some ( 0. ) ;
303
+ assert from_str ( ".e-1" ) == some ( 0. ) ;
304
+ assert from_str ( "5." ) == some ( 5. ) ;
305
+ assert from_str ( ".5" ) == some ( 0.5 ) ;
306
+ assert from_str ( "0.5" ) == some ( 0.5 ) ;
307
+ assert from_str ( "0.5" ) == some ( 0.5 ) ;
308
+ assert from_str ( "0.5" ) == some ( 0.5 ) ;
309
+ assert from_str ( "-.5" ) == some ( -0.5 ) ;
310
+ assert from_str ( "-.5" ) == some ( -0.5 ) ;
311
+ assert from_str ( "-5" ) == some ( -5. ) ;
312
+
313
+ assert from_str ( "" ) == none;
314
+ assert from_str ( "x" ) == none;
315
+ assert from_str ( " " ) == none;
316
+ assert from_str ( " " ) == none;
317
+ assert from_str ( "e" ) == none;
318
+ assert from_str ( "E" ) == none;
319
+ assert from_str ( "E1" ) == none;
320
+ assert from_str ( "1e1e1" ) == none;
321
+ assert from_str ( "1e1.1" ) == none;
322
+ assert from_str ( "1e1-1" ) == none;
327
323
}
328
324
329
325
#[ test]
0 commit comments