|
| 1 | +import Data.Char (isHexDigit, ord) |
| 2 | +import Numeric (readInt, readFloat, readOct, readDec, readHex, readSigned) |
| 3 | +import Text.Printf (printf) |
| 4 | + |
| 5 | +main = do |
| 6 | + print $ readInt 2 (`elem` "01") (\x -> ord x - ord '0') "11" -- [(3, "")] |
| 7 | + -- The same as 'print (readOct "11")'. |
| 8 | + print $ readOct "11" -- [(9, "")] |
| 9 | + |
| 10 | + print $ readDec "5" -- [(5, "")] |
| 11 | + print $ readDec "+5" -- [] |
| 12 | + print $ readDec "-5" -- [] |
| 13 | + print $ readDec "5mm" -- [(5, "mm")] |
| 14 | + print $ readSigned readDec "5" -- [(5, "")] |
| 15 | + print $ readSigned readDec "+5" -- [] |
| 16 | + print $ readSigned readDec "-5" -- [(-5, "")] |
| 17 | + print $ readSigned readDec "5mm" -- [(5, "mm")] |
| 18 | + |
| 19 | + print $ readDec "(5)" -- [] |
| 20 | + print $ readDec "\"5\"" -- [] |
| 21 | + print $ readDec "[5]" -- [] |
| 22 | + |
| 23 | + print $ readDec "NaN" -- [] |
| 24 | + print $ readDec "Infinity" -- [] |
| 25 | + print $ readDec "-Infinity" -- [] |
| 26 | + |
| 27 | + -- Type specification is required to resolve the ambiguity of whether we should read Int or Integer. |
| 28 | + print $ readDec "5.1" |
| 29 | + -- 5.1 [(5, ".1")] |
| 30 | + print $ readDec "5.1e50" |
| 31 | + -- 5.1 [(5, ".1e50")] |
| 32 | + print $ readDec "0.000000000005" |
| 33 | + -- [(0, ".000000000005")] |
| 34 | + print $ readDec "0.0000005" |
| 35 | + -- [(0, ".0000005")] |
| 36 | + print $ readDec "0.000005" |
| 37 | + -- [(0, ".0000005")] |
| 38 | + |
| 39 | + print $ readHex "fF" -- [(255, "")] |
| 40 | + print $ readHex "0xff" -- [(0, "xff")] |
| 41 | + print $ readHex "0xFf" -- [(0, "xFf")] |
| 42 | + print $ readHex " 0xFf " -- [] |
| 43 | + |
| 44 | + print $ readInt 2 (`elem` "01") (\x -> ord x - ord '0') "ff" -- [] |
| 45 | + print $ readOct "ff" -- [] |
| 46 | + print $ readDec "ff" -- [] |
| 47 | + print $ readHex "ff" -- [(255, "")] |
| 48 | + |
| 49 | + let readHexDigit x = fst $ head $ readHex [x] |
| 50 | + print $ readInt 16 isHexDigit readHexDigit "ff" -- [(255, "")] |
| 51 | + print $ readInt 17 isHexDigit readHexDigit "ff" -- [(270, "")] |
| 52 | + print $ readInt 20 isHexDigit readHexDigit "ff" -- [(315, "")] |
| 53 | + print $ readInt 30 isHexDigit readHexDigit "ff" -- [(465, "")] |
| 54 | + print $ readInt 31 isHexDigit readHexDigit "ff" -- [(480, "")] |
| 55 | + print $ readInt 32 isHexDigit readHexDigit "ff" -- [(495, "")] |
| 56 | + print $ readInt 33 isHexDigit readHexDigit "ff" -- [(510, "")] |
| 57 | + print $ readInt 34 isHexDigit readHexDigit "ff" -- [(525, "")] |
| 58 | + print $ readInt 35 isHexDigit readHexDigit "ff" -- [(540, "")] |
| 59 | + print $ readInt 36 isHexDigit readHexDigit "ff" -- [(555, "")] |
| 60 | + print $ readInt 37 isHexDigit readHexDigit "ff" -- [(570, "")] |
| 61 | + |
| 62 | + print $ readFloat "3.14" -- [(3.14, "")] |
| 63 | + print $ readFloat "314e-2" -- [(3.14, "")] |
| 64 | + print $ readFloat "3.14text" -- [(3.14, "text")] |
| 65 | + print $ readFloat "0.0314E+2" -- [(3.14, "")] |
| 66 | + |
| 67 | + print $ readFloat "5" -- [(5.0, "")] |
| 68 | + print $ readFloat "5.0" -- [(5.0, "")] |
| 69 | + print $ readFloat "5.0000000000000001" -- [(5.0, "")] |
| 70 | + |
| 71 | + print $ readFloat "5.1" -- [(5.1, "")] |
| 72 | + print $ readFloat "5.000000000000001" -- [(5.000000000000001, "")] |
| 73 | + |
| 74 | + print $ readFloat "100" -- [(100, "")] |
| 75 | + print $ readSigned readFloat "-100" -- [(-100, "")] |
| 76 | + print $ readFloat "+100" -- [] |
| 77 | + |
| 78 | + print $ readFloat "5" -- [(5, "")] |
| 79 | + print $ readFloat "+5" -- [] |
| 80 | + print $ readFloat "5mm" -- [(5, "mm")] |
| 81 | + |
| 82 | + print $ readFloat "(5)" -- [] |
| 83 | + print $ readFloat "\"5\"" -- [] |
| 84 | + print $ readFloat "[5]" -- [] |
| 85 | + |
| 86 | + print $ readFloat "NaN" -- [] |
| 87 | + print $ readFloat "Infinity" -- [] |
| 88 | + print $ readFloat "-Infinity" -- [] |
0 commit comments