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 {
34
34
self . write_char ( b'"' ) ;
35
35
}
36
36
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
+
37
75
fn write_json ( & mut self , json : & JsonValue ) {
38
76
match * json {
39
77
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) ,
41
79
JsonValue :: Boolean ( ref value) => self . write ( if * value { b"true" } else { b"false" } ) ,
42
80
JsonValue :: Null => self . write ( b"null" ) ,
43
81
JsonValue :: Array ( ref array) => {
Original file line number Diff line number Diff line change @@ -150,7 +150,7 @@ impl<'a> Tokenizer<'a> {
150
150
Some ( b'.' ) | Some ( b'e' ) | Some ( b'E' ) => { } ,
151
151
_ => {
152
152
return if first == b'-' {
153
- Ok ( ( num as f64 ) * - 1.0 )
153
+ Ok ( - ( num as f64 ) )
154
154
} else {
155
155
Ok ( num as f64 )
156
156
} ;
Original file line number Diff line number Diff line change @@ -111,7 +111,7 @@ fn stringify_string() {
111
111
112
112
#[ test]
113
113
fn stringify_number ( ) {
114
- assert_eq ! ( stringify( 3.14 ) , "3.14 " ) ;
114
+ assert_eq ! ( stringify( 3.141592653589793 ) , "3.141592653589793 " ) ;
115
115
}
116
116
117
117
#[ test]
@@ -283,7 +283,7 @@ fn parse_null() {
283
283
284
284
#[ test]
285
285
fn parse_number ( ) {
286
- assert_eq ! ( parse( "3.14 " ) . unwrap( ) , 3.14 ) ;
286
+ assert_eq ! ( parse( "3.141592653589793 " ) . unwrap( ) , 3.141592653589793 ) ;
287
287
}
288
288
289
289
#[ test]
You can’t perform that action at this time.
0 commit comments