From fec0f16c98ab066ff11be35b5a8bb0d80efa90f1 Mon Sep 17 00:00:00 2001 From: Barosl Lee Date: Mon, 24 Nov 2014 03:14:02 +0900 Subject: [PATCH] libserialize: Always use a decimal point when emitting a float value JSON doesn't distinguish between integer and float. They are just numbers. Also, in the current implementation, a fractional number without the fractional part is encoded without a decimal point. Thereforce, when the value is decoded, it is first rendered as Json, either I64 or U64. This reduces type safety, because while the original intention was to cast the value to float, it can also be casted to integer. As a workaround of this problem, this commit makes the encoder always emit a decimal point even if it is not necessary. If the fractional part of a float number is zero, ".0" is padded to the end of the result. [breaking-change] --- src/libserialize/json.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index 23e2c4b9830..163fbcdff70 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -386,7 +386,8 @@ fn spaces(wr: &mut io::Writer, mut n: uint) -> Result<(), io::IoError> { fn fmt_number_or_null(v: f64) -> string::String { match v.classify() { FPNaN | FPInfinite => string::String::from_str("null"), - _ => f64::to_str_digits(v, 6u) + _ if v.fract() != 0f64 => f64::to_str_digits(v, 6u), + _ => f64::to_str_digits(v, 6u) + ".0", } } @@ -2504,8 +2505,8 @@ fn test_write_i64() { #[test] fn test_write_f64() { - assert_eq!(F64(3.0).to_string().into_string(), "3"); - assert_eq!(F64(3.0).to_pretty_str().into_string(), "3"); + assert_eq!(F64(3.0).to_string().into_string(), "3.0"); + assert_eq!(F64(3.0).to_pretty_str().into_string(), "3.0"); assert_eq!(F64(3.1).to_string().into_string(), "3.1"); assert_eq!(F64(3.1).to_pretty_str().into_string(), "3.1"); -- 2.44.0