File tree Expand file tree Collapse file tree 3 files changed +42
-4
lines changed
Expand file tree Collapse file tree 3 files changed +42
-4
lines changed Original file line number Diff line number Diff line change @@ -34,10 +34,48 @@ pub trait Generator {
3434 self . write_char ( b'"' ) ;
3535 }
3636
37+ fn write_digits_from_u64 ( & mut self , mut num : u64 , length : & mut u8 ) {
38+ let digit = ( num % 10 ) as u8 ;
39+ num /= 10 ;
40+ if num > 0 {
41+ self . write_digits_from_u64 ( num, length) ;
42+ }
43+ * length += 1 ;
44+ self . write_char ( digit + b'0' ) ;
45+ }
46+
47+ fn write_number ( & mut self , mut num : f64 ) {
48+ let mut length = 0 ;
49+ if num < 0.0 {
50+ num = -num;
51+ self . write_char ( b'-' ) ;
52+ }
53+
54+ self . write_digits_from_u64 ( num as u64 , & mut length) ;
55+
56+ let mut fract = num. fract ( ) ;
57+ if fract < 1e-10 {
58+ return ;
59+ }
60+
61+ fract *= 10.0 ;
62+ self . write_char ( b'.' ) ;
63+ self . write_char ( ( fract as u8 ) + b'0' ) ;
64+ fract = fract. fract ( ) ;
65+ length += 2 ;
66+
67+ while length < 17 && fract > 0.01 {
68+ fract *= 10.0 ;
69+ self . write_char ( ( fract as u8 ) + b'0' ) ;
70+ fract = fract. fract ( ) ;
71+ length += 1 ;
72+ }
73+ }
74+
3775 fn write_json ( & mut self , json : & JsonValue ) {
3876 match * json {
3977 JsonValue :: String ( ref string) => self . write_string ( string) ,
40- JsonValue :: Number ( ref number) => self . write ( number. to_string ( ) . as_bytes ( ) ) ,
78+ JsonValue :: Number ( ref number) => self . write_number ( * number) ,
4179 JsonValue :: Boolean ( ref value) => self . write ( if * value { b"true" } else { b"false" } ) ,
4280 JsonValue :: Null => self . write ( b"null" ) ,
4381 JsonValue :: Array ( ref array) => {
Original file line number Diff line number Diff line change @@ -150,7 +150,7 @@ impl<'a> Tokenizer<'a> {
150150 Some ( b'.' ) | Some ( b'e' ) | Some ( b'E' ) => { } ,
151151 _ => {
152152 return if first == b'-' {
153- Ok ( ( num as f64 ) * - 1.0 )
153+ Ok ( - ( num as f64 ) )
154154 } else {
155155 Ok ( num as f64 )
156156 } ;
Original file line number Diff line number Diff line change @@ -111,7 +111,7 @@ fn stringify_string() {
111111
112112#[ test]
113113fn stringify_number ( ) {
114- assert_eq ! ( stringify( 3.14 ) , "3.14 " ) ;
114+ assert_eq ! ( stringify( 3.141592653589793 ) , "3.141592653589793 " ) ;
115115}
116116
117117#[ test]
@@ -283,7 +283,7 @@ fn parse_null() {
283283
284284#[ test]
285285fn parse_number ( ) {
286- assert_eq ! ( parse( "3.14 " ) . unwrap( ) , 3.14 ) ;
286+ assert_eq ! ( parse( "3.141592653589793 " ) . unwrap( ) , 3.141592653589793 ) ;
287287}
288288
289289#[ test]
You can’t perform that action at this time.
0 commit comments