Skip to content

Commit 65b2559

Browse files
number: Add support for nan
Signed-off-by: Patrick José Pereira <[email protected]>
1 parent c5e9d27 commit 65b2559

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

src/number.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,10 @@ impl Number {
145145
/// ```
146146
/// # use serde_json::json;
147147
/// #
148-
/// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
148+
/// let v = json!({ "a": 256.0, "b": 64, "c": -64, "d": nan });
149149
///
150150
/// assert!(v["a"].is_f64());
151+
/// assert!(v["d"].is_f64());
151152
///
152153
/// // Integers.
153154
/// assert!(!v["b"].is_f64());
@@ -230,11 +231,12 @@ impl Number {
230231
/// ```
231232
/// # use serde_json::json;
232233
/// #
233-
/// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
234+
/// let v = json!({ "a": 256.0, "b": 64, "c": -64, "d": nan });
234235
///
235236
/// assert_eq!(v["a"].as_f64(), Some(256.0));
236237
/// assert_eq!(v["b"].as_f64(), Some(64.0));
237238
/// assert_eq!(v["c"].as_f64(), Some(-64.0));
239+
/// assert!(v["d"].as_f64().unwrap().is_nan());
238240
/// ```
239241
#[inline]
240242
pub fn as_f64(&self) -> Option<f64> {
@@ -245,7 +247,7 @@ impl Number {
245247
N::Float(n) => Some(n),
246248
}
247249
#[cfg(feature = "arbitrary_precision")]
248-
self.n.parse::<f64>().ok().filter(|float| float.is_finite())
250+
self.n.parse::<f64>().ok().filter(|float| !float.is_infinite())
249251
}
250252

251253
/// Converts a finite `f64` to a `Number`. Infinite or NaN values are not JSON
@@ -258,7 +260,9 @@ impl Number {
258260
/// #
259261
/// assert!(Number::from_f64(256.0).is_some());
260262
///
261-
/// assert!(Number::from_f64(f64::NAN).is_none());
263+
/// assert!(Number::from_f64(f64::NAN).is_some());
264+
///
265+
/// assert!(Number::from_f64(f64::INFINITY).is_none());
262266
/// ```
263267
#[inline]
264268
pub fn from_f64(f: f64) -> Option<Number> {
@@ -275,6 +279,14 @@ impl Number {
275279
};
276280
Some(Number { n })
277281
} else {
282+
#[cfg(not(feature = "arbitrary_precision"))]
283+
{
284+
if f.is_nan() {
285+
return Some(Number {
286+
n: N::Float(f64::NAN),
287+
});
288+
}
289+
}
278290
None
279291
}
280292
}
@@ -294,7 +306,7 @@ impl Display for Number {
294306
match self.n {
295307
N::PosInt(u) => formatter.write_str(itoa::Buffer::new().format(u)),
296308
N::NegInt(i) => formatter.write_str(itoa::Buffer::new().format(i)),
297-
N::Float(f) => formatter.write_str(ryu::Buffer::new().format_finite(f)),
309+
N::Float(f) => formatter.write_str(ryu::Buffer::new().format(f)),
298310
}
299311
}
300312

0 commit comments

Comments
 (0)