Sunday, January 1, 2012

Active Patterns to transform number



Today I read through the active pattern in F# and was inspired to use it somehow. The following is a very simple sample to convert number. I will continue improving this code and, in the meanwhile, improve my F# skill.

the following code convert int 1002 to string "One Thousand and Two".

let ( | Billion | Million | Thousand | Hundred | Less |) x =
    match x with
    | _ when x >=1000000000 -> Billion
    | _ when x >=1000000 -> Million
    | _ when x >=1000 -> Thousand
    | _ when x >=100 -> Hundred
    | _ -> Less

let rec getStr2 x =
    match x with
    | 0 -> ""
    | 1 -> "One"
    | 2 -> "Two"
    | 3 -> "Three"
    | 4 -> "Four"
    | 5 -> "Five"
    | 6 -> "Six"
    | 7 -> "Seven"
    | 8 -> "Eight"
    | 9 -> "Nine"
    | 10 -> "Ten"
    | 11 -> "Eleven"
    | 12 -> "Twelve"
    | 13 -> "Thirteen"
    | 14 -> "Fourteen"
    | 15 -> "Fifteen"
    | 16 -> "Sixteen"
    | 17 -> "Seventeen"
    | 18 -> "Eighteen"
    | 19 -> "Nineteen"
    | _ when x >= 20 && x < 30 -> "Twenty " + (getStr2 (x%20))
    | _ when x >= 30 && x < 40 -> "Thirty " + (getStr2 (x%30))
    | _ when x >= 40 && x < 50 -> "Forty " + (getStr2 (x%40))
    | _ when x >= 50 && x < 60 -> "Fifty " + (getStr2 (x%50))
    | _ when x >= 60 && x < 70 -> "Sixty " + (getStr2 (x%60))
    | _ when x >= 70 && x < 80 -> "Seventy " + (getStr2 (x%70))
    | _ when x >= 80 && x < 90 -> "Eighty " + (getStr2 (x%80))
    | _ when x >= 90 && x < 100 -> "Ninety " + (getStr2 (x%90))

let rec getStr x =
    let joinStr numberBase word =
        let a = getStr (x % numberBase)
        let b = getStr (x / numberBase)
        sprintf "%s %s %s" b word a
    match x with
    | Less -> getStr2 x
    | Hundred -> joinStr 100 "Hundred"      
    | Thousand -> joinStr 1000 "Thousand"
    | Million -> joinStr 1000000 "Million"
    | Billion -> joinStr 1000000000 "Billion"

No comments: