Skip to content

Commit 0f85c34

Browse files
author
Clar Charr
committed
Allow "infinity" and ignore case when parsing floats.
1 parent 178becd commit 0f85c34

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

src/libcore/num/dec2flt/mod.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ macro_rules! from_str_float_impl {
123123
/// * '2.5E-10'
124124
/// * '5.'
125125
/// * '.5', or, equivalently, '0.5'
126-
/// * 'inf', '-inf', 'NaN'
126+
/// * 'inf', `-inf`, or equivalently 'infinity', `-infinity` (case-insensitive)
127+
/// * 'NaN' (case-insensitive)
127128
///
128129
/// Leading and trailing whitespace represent an error.
129130
///
@@ -215,10 +216,17 @@ fn dec2flt<T: RawFloat>(s: &str) -> Result<T, ParseFloatError> {
215216
ParseResult::Valid(decimal) => convert(decimal)?,
216217
ParseResult::ShortcutToInf => T::INFINITY,
217218
ParseResult::ShortcutToZero => T::ZERO,
218-
ParseResult::Invalid => match s {
219-
"inf" => T::INFINITY,
220-
"NaN" => T::NAN,
221-
_ => { return Err(pfe_invalid()); }
219+
ParseResult::Invalid => {
220+
let buf = [0; 8]
221+
.get_mut(..s.len())
222+
.ok_or_else(pfe_invalid)?;
223+
buf.copy_from_slice(s.as_bytes());
224+
buf.make_ascii_uppercase();
225+
match &*buf {
226+
b"INFINITY" | b"INF" => T::INFINITY,
227+
b"NAN" => T::NAN,
228+
_ => { return Err(pfe_invalid()); }
229+
}
222230
}
223231
};
224232

src/libcore/tests/num/dec2flt/mod.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,23 @@ fn whitespace() {
122122
#[test]
123123
fn nan() {
124124
assert!("NaN".parse::<f32>().unwrap().is_nan());
125+
assert!("NAN".parse::<f32>().unwrap().is_nan());
126+
assert!("nan".parse::<f32>().unwrap().is_nan());
125127
assert!("NaN".parse::<f64>().unwrap().is_nan());
128+
assert!("NAN".parse::<f64>().unwrap().is_nan());
129+
assert!("nan".parse::<f64>().unwrap().is_nan());
126130
}
127131

128132
#[test]
129133
fn inf() {
130-
assert_eq!("inf".parse(), Ok(f64::INFINITY));
131-
assert_eq!("-inf".parse(), Ok(f64::NEG_INFINITY));
132-
assert_eq!("inf".parse(), Ok(f32::INFINITY));
134+
assert_eq!("INF".parse(), Ok(f32::INFINITY));
133135
assert_eq!("-inf".parse(), Ok(f32::NEG_INFINITY));
136+
assert_eq!("INFINITy".parse(), Ok(f32::INFINITY));
137+
assert_eq!("-infinitY".parse(), Ok(f32::NEG_INFINITY));
138+
assert_eq!("INF".parse(), Ok(f64::INFINITY));
139+
assert_eq!("-inf".parse(), Ok(f64::NEG_INFINITY));
140+
assert_eq!("INFINITy".parse(), Ok(f64::INFINITY));
141+
assert_eq!("-infinitY".parse(), Ok(f64::NEG_INFINITY));
134142
}
135143

136144
#[test]

0 commit comments

Comments
 (0)