This is a simple package for relatively careless parsing of numbers from ByteStrings. It works to parse out integer strings, floating point strings and hex strings.
http://hackage.haskell.org/package/bytestring-nums For integer strings, an initial sign is detected and non-digit characters are ignored: Prelude> :load Data.ByteString.Nums.Careless.Int *Data.ByteString.Nums.Careless.Int> let strings = ["121.3040", "1o2", "-a1", "0xff", "-0x30"] *Data.ByteString.Nums.Careless.Int> fmap (int . pack) strings :: [Int] [1213040,12,-1,0,-30] *Data.ByteString.Nums.Careless.Int> fmap (int . pack) strings :: [Double] [1213040.0,12.0,-1.0,0.0,-30.0] For hexadecimal strings, no signs are recognized and characters that aren't hex digits are ignored. One consequence of this is that an initial `0x` is skipped. Prelude> :load Data.ByteString.Nums.Careless.Hex *Data.ByteString.Nums.Careless.Hex> let strings = ["121.3040", "1o2", "-a1", "0xff", "-0x30"] *Data.ByteString.Nums.Careless.Hex> fmap (hex . pack) strings :: [Int] [18952256,18,161,255,48] The float parser recognizes the last group of digits behind a comma or period as the fractional part; all preceding digits are treated as the integral part. Naturally, signs are handled. Prelude> :load Data.ByteString.Nums.Careless.Float *Data.ByteString.Nums.Careless.Float> let strings = ["121.3040", "2.100,32", "1,o2", "-a1", "0xff", "-0x30"] *Data.ByteString.Nums.Careless.Float> fmap (float . pack) strings :: [Double] [122.304,2100.32,1.2,-1.0,0.0,-30.0] *Data.ByteString.Nums.Careless.Float> fmap (float . pack) strings :: [Rational] [15163 % 125,52508 % 25,6 % 5,(-1) % 1,0 % 1,(-30) % 1] I have not applied any `SPECIALIZE` or `INLINE` directives at this time; it'd be great to have some insight in to optimizing collections of small functions like this library. -- Jason Dusek _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe