You've already forked json-iterator
							
							
				mirror of
				https://github.com/json-iterator/go.git
				synced 2025-10-31 00:07:40 +02:00 
			
		
		
		
	| @@ -2,6 +2,7 @@ package jsoniter | ||||
|  | ||||
| import ( | ||||
| 	"strconv" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| var POW10 []uint64 | ||||
| @@ -11,6 +12,10 @@ func init() { | ||||
| } | ||||
|  | ||||
| func (stream *Stream) WriteFloat32(val float32) { | ||||
| 	stream.WriteRaw(strconv.FormatFloat(float64(val), 'f', -1, 32)) | ||||
| } | ||||
|  | ||||
| func (stream *Stream) WriteFloat32Lossy(val float32) { | ||||
| 	if val < 0 { | ||||
| 		stream.writeByte('-') | ||||
| 		val = -val | ||||
| @@ -41,6 +46,10 @@ func (stream *Stream) WriteFloat32(val float32) { | ||||
| } | ||||
|  | ||||
| func (stream *Stream) WriteFloat64(val float64) { | ||||
| 	stream.WriteRaw(strconv.FormatFloat(float64(val), 'f', -1, 64)) | ||||
| } | ||||
|  | ||||
| func (stream *Stream) WriteFloat64Lossy(val float64) { | ||||
| 	if val < 0 { | ||||
| 		stream.writeByte('-') | ||||
| 		val = -val | ||||
| @@ -69,3 +78,15 @@ func (stream *Stream) WriteFloat64(val float64) { | ||||
| 		stream.n-- | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func EnableLossyFloatMarshalling() { | ||||
| 	// for better performance | ||||
| 	RegisterTypeEncoder("float32", func(ptr unsafe.Pointer, stream *Stream) { | ||||
| 		val := *((*float32)(ptr)) | ||||
| 		stream.WriteFloat32Lossy(val) | ||||
| 	}) | ||||
| 	RegisterTypeEncoder("float64", func(ptr unsafe.Pointer, stream *Stream) { | ||||
| 		val := *((*float64)(ptr)) | ||||
| 		stream.WriteFloat64Lossy(val) | ||||
| 	}) | ||||
| } | ||||
| @@ -56,6 +56,15 @@ func Test_customize_byte_array_encoder(t *testing.T) { | ||||
| 	should.Equal(`"abc"`, str) | ||||
| } | ||||
|  | ||||
| func Test_customize_float_marshal(t *testing.T) { | ||||
| 	should := require.New(t) | ||||
| 	EnableLossyFloatMarshalling() | ||||
| 	defer CleanEncoders() | ||||
| 	str, err := MarshalToString(float32(1.23456789)) | ||||
| 	should.Nil(err) | ||||
| 	should.Equal("1.234568", str) | ||||
| } | ||||
|  | ||||
| type Tom struct { | ||||
| 	field1 string | ||||
| } | ||||
|   | ||||
| @@ -75,7 +75,7 @@ func Test_write_float32(t *testing.T) { | ||||
| 			should := require.New(t) | ||||
| 			buf := &bytes.Buffer{} | ||||
| 			stream := NewStream(buf, 4096) | ||||
| 			stream.WriteFloat32(val) | ||||
| 			stream.WriteFloat32Lossy(val) | ||||
| 			stream.Flush() | ||||
| 			should.Nil(stream.Error) | ||||
| 			should.Equal(strconv.FormatFloat(float64(val), 'f', -1, 32), buf.String()) | ||||
| @@ -94,7 +94,7 @@ func Test_write_float32(t *testing.T) { | ||||
| 	buf := &bytes.Buffer{} | ||||
| 	stream := NewStream(buf, 10) | ||||
| 	stream.WriteRaw("abcdefg") | ||||
| 	stream.WriteFloat32(1.123456) | ||||
| 	stream.WriteFloat32Lossy(1.123456) | ||||
| 	stream.Flush() | ||||
| 	should.Nil(stream.Error) | ||||
| 	should.Equal("abcdefg1.123456", buf.String()) | ||||
| @@ -108,7 +108,7 @@ func Test_write_float64(t *testing.T) { | ||||
| 			should := require.New(t) | ||||
| 			buf := &bytes.Buffer{} | ||||
| 			stream := NewStream(buf, 4096) | ||||
| 			stream.WriteFloat64(val) | ||||
| 			stream.WriteFloat64Lossy(val) | ||||
| 			stream.Flush() | ||||
| 			should.Nil(stream.Error) | ||||
| 			should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String()) | ||||
| @@ -127,7 +127,7 @@ func Test_write_float64(t *testing.T) { | ||||
| 	buf := &bytes.Buffer{} | ||||
| 	stream := NewStream(buf, 10) | ||||
| 	stream.WriteRaw("abcdefg") | ||||
| 	stream.WriteFloat64(1.123456) | ||||
| 	stream.WriteFloat64Lossy(1.123456) | ||||
| 	stream.Flush() | ||||
| 	should.Nil(stream.Error) | ||||
| 	should.Equal("abcdefg1.123456", buf.String()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user