Advertisement
CloudRoutine

English Integer

May 12th, 2014
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.57 KB | None | 0 0
  1. let english_integer ( i : bigint ) : string  =
  2.  
  3.     let ZERO_TO_19 =
  4.         [   "zero"     ;    "one"      ;    "two"      ; "three"   ;  "four"    ;  "five"       ;
  5.             "six"      ;    "seven"    ;    "eight"    ; "nine"    ;  "ten"     ;  "eleven"     ;
  6.             "twelve"   ;    "thirteen" ;    "fourteen" ; "fifteen" ;  "sixteen" ;  "seventeen"  ;    
  7.             "eighteen" ;    "nineteen"                                                          ]
  8.    
  9.     let HYPHEN_ONES =
  10.         [   ""     ; "-one"   ; "-two"    ; "-three" ; "-four" ; "-five"     ;
  11.             "-six" ; "-seven" ; "-eight"  ; "-nine"                          ]
  12.  
  13.     let TWENTY_UP =
  14.         [   ""      ; ""      ; "twenty"  ; "thirty" ; "forty"      ;
  15.             "fifty" ; "sixty" ; "seventy" ; "eighty" ; "ninety"     ]
  16.    
  17.     let THOUSAND_UP =
  18.         [   ""              ;   " thousand"        ;    " million"       ;  " billion"              ;
  19.             " trillion"     ;   " quadrillion"     ;    " quintillion"   ;  " sextillion"           ;    
  20.             " septillion"   ;   " octillion"       ;    " nonillion"     ;  " decillion"            ;
  21.             " undecillion"  ;   " duodecillion"    ;    " tredecillion"  ;  " quattuordecillion"    ;
  22.             " sexdecillion" ;   " septendecillion" ;    " octodecillion" ;  " novemdecillion"       ;  
  23.             " vigintillion"                                                                         ]
  24.  
  25.     let rec toEnglish i step  =
  26.         match i with
  27.         | x     when x < 0I    ->   "negative " + toEnglish -x 0  
  28.  
  29.         | x     when x < 20I   ->   ZERO_TO_19.Item (x|>int)  + THOUSAND_UP.Item (step)
  30.  
  31.         | x     when x < 100I  ->   TWENTY_UP.Item   (( x|>int ) / 10 ) +
  32.                                     HYPHEN_ONES.Item (( x|>int ) % 10 ) +
  33.                                     THOUSAND_UP.Item ( step    )
  34.  
  35.         | x     when x < 1000I ->   let  s = ( HYPHEN_ONES.Item (( x|> int) / 100 )).Substring 1 + " hundred"
  36.                                     if   i % 100I > 0I
  37.                                     then s + " and " + toEnglish ( x % 100I ) 0 + THOUSAND_UP.Item ( step )
  38.                                     else s + THOUSAND_UP.Item ( step )
  39.  
  40.         | x     ->  let   current = i % 1000I
  41.                     match current  with
  42.                     | x when x = 0I ->  toEnglish (i/1000I) ( step + 1 )
  43.  
  44.                     | x             ->  toEnglish (i/1000I) ( step + 1 ) + " " +
  45.                                         toEnglish current   ( step     )
  46.     in  toEnglish i 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement