diff --git a/fix_float.go b/fix_float.go index 4c19730bd..e99f730d5 100644 --- a/fix_float.go +++ b/fix_float.go @@ -2,7 +2,6 @@ package quickfix import ( "fmt" - "regexp" "strconv" ) @@ -22,8 +21,10 @@ func (f *FIXFloat) Read(bytes []byte) error { } //strconv allows values like "+100.00", which is not allowed for FIX float types - if valid, _ := regexp.MatchString("^[0-9.-]+$", string(bytes)); !valid { - return fmt.Errorf("invalid value %v", string(bytes)) + for _, b := range bytes { + if b != '.' && b != '-' && !isDecimal(b) { + return fmt.Errorf("invalid value %v", string(bytes)) + } } *f = FIXFloat(val) @@ -34,3 +35,7 @@ func (f *FIXFloat) Read(bytes []byte) error { func (f FIXFloat) Write() []byte { return []byte(strconv.FormatFloat(float64(f), 'f', -1, 64)) } + +func isDecimal(b byte) bool { + return '0' <= b && b <= '9' +} diff --git a/fix_float_test.go b/fix_float_test.go index ee85746ca..8cb1d1f4c 100644 --- a/fix_float_test.go +++ b/fix_float_test.go @@ -29,7 +29,12 @@ func TestFloatRead(t *testing.T) { expectError bool }{ {[]byte("15"), 15.0, false}, + {[]byte("99.9"), 99.9, false}, + {[]byte("0.00"), 0.0, false}, + {[]byte("-99.9"), -99.9, false}, + {[]byte("-99.9.9"), 0.0, true}, {[]byte("blah"), 0.0, true}, + {[]byte("1.a1"), 0.0, true}, {[]byte("+200.00"), 0.0, true}, } @@ -46,3 +51,11 @@ func TestFloatRead(t *testing.T) { } } } + +func BenchmarkFloatRead(b *testing.B) { + val := []byte("15.1234") + for i := 0; i < b.N; i++ { + var field FIXFloat + field.Read(val) + } +}