官术网_书友最值得收藏!

Reading a number from another base

Decimal, binary, and hexadecimal are widely used numeral systems that are often represented using a string. This recipe will show how to convert a string representation of a number in an arbitrary base to its decimal integer. We use the readInt function, which is the dual of the showIntAtBase function described in the previous recipe.

How to do it...

  1. Import readInt and the following functions for character manipulation as follows:
    import Data.Char (ord, digitToInt, isDigit)
    import Numeric (readInt)
  2. Define a function to convert a string representing a number in a particular base to a decimal integer as follows:
    str 'base' b = readInt b isValidDigit letterToNum str
  3. Define the mapping between letters and numbers for larger digits, as shown in the following code snippet:
    letterToNum :: Char -> Int
    letterToNum d
      | isDigit d = digitToInt d
      | otherwise = ord d - ord 'a' + 10
                 
    isValidDigit :: Char -> Int
    isValidDigit d = letterToNum d >= 0
  4. Print out the result using the following line of codes:
    main :: IO ()
    main = do
      print $ "8" 'base' 12
      print $ "a" 'base' 12
      print $ "10" 'base' 12
      print $ "3b" 'base' 12
  5. The printed output is as follows:
    [(8,"")]
    [(10,"")]
    [(12,"")]
    [(47,"")]
    

How it works...

The readInt function reads an unsigned integral value and converts it to the specified base. It takes in the base as the first argument, valid characters as the second argument, and its mapping from character to number as the third argument. We order our digits in the following order: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, and so on up to 36 characters. Putting it all together, we get a convenient way to convert a string representation of a number in an arbitrary base to a decimal number.

Tip

This recipe assumes that a valid string is passed into the base function for conversion. Further error checks are necessary to ensure that erroneous input such as "a" 'base' 4 should not result in an answer.

See also

To do the reverse, refer to the Displaying a number in another base recipe.

主站蜘蛛池模板: 星座| 噶尔县| 额尔古纳市| 工布江达县| 三穗县| 乐业县| 龙山县| 合作市| 荥阳市| 万州区| 西安市| 阳谷县| 抚顺县| 临朐县| 武功县| 广州市| 漳州市| 德清县| 台东市| 陕西省| 夹江县| 吐鲁番市| 巩义市| 齐河县| 本溪| 丹棱县| 安远县| 鹤岗市| 清徐县| 饶平县| 双鸭山市| 六盘水市| 塘沽区| 九龙坡区| 汾西县| 蚌埠市| 富平县| 娄底市| 四平市| 龙陵县| 麦盖提县|