packages feed

ordinal (empty) → 0.1.0.0

raw patch · 20 files changed

+3008/−0 lines, 20 filesdep +QuickCheckdep +basedep +containerssetup-changed

Dependencies added: QuickCheck, base, containers, hspec, ordinal, template-haskell, text, vector

Files

+ CHANGELOG.md view
@@ -0,0 +1,8 @@+# `ordinal` changelog++For a full list of changes, see the history on [GitHub](https://github.com/hapytex/ordinal).++## Version 0.1.0.0++The first version that is deployed on Hackage. This version contains+`toCardinal` and `toOrdinal` functions for /Dutch/, /English/ and /French/.
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Willem Van Onsem (c) 2020++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Willem Van Onsem nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,73 @@+# ordinal++[![Build Status of the package by Travis](https://travis-ci.com/hapytex/ordinal.svg?branch=master)](https://travis-ci.com/hapytex/ordinal)+[![Build Status of the package by Hackage](https://matrix.hackage.haskell.org/api/v2/packages/ordinal/badge)](https://matrix.hackage.haskell.org/#/package/ordinal)+[![Hackage version badge](https://img.shields.io/hackage/v/ordinal.svg)](https://hackage.haskell.org/package/ordinal)++A package to convert numbers to the words. It contains a datatype for+algorithmic conversion that can convert the number for *most* languages.+It converts numbers to its *cardinal* and *ordinal* format.++The package is based on Python's [**`num2words`** package \[GitHub\]](https://github.com/savoirfairelinux/num2words).++The following languages are currently supported (in *alphabetical* order):++ 1. Dutch (nl);+ 2. English (en); and+ 3. French (fr)++## Usage++One can import the `Text.Numerals` module, and use the `toCardinal`+and `toOrdinal` functions with a number-to-word algorithm that is exported by+the `Text.Numerals.Languages` module, for example:++```+Prelude Text.Numerals Data.Text.IO> Data.Text.IO.putStrLn (toCardinal english 42)+forty-two+Prelude Text.Numerals Data.Text.IO> Data.Text.IO.putStrLn (toOrdinal french 42)+quarante-deuxième+```++One can also define a language algorithm themselves, for this one can look at+the source code of the language modules.++## Package structure++The modules are all located under `Text.Numerals` module. The `Text.Numerals`+module exports the main modules.++The `Text.Numerals.Class` module defines classes, data types and synonyms that+provide an interface to convert numbers to words.++The `Text.Numerals.Algorithm` module contains algorithms to make converting+numbers to words more convienient. The module `Text.Numerals.Algorithm.Template`+contains functions for *template Haskell*, at the moment this only contains a+function to make an `ordinize` function.++The `Text.Numerals.Prefix` module contains numerical prefixes, at the moment+only *Latin* prefixes. These are used for *short scale* and *long scale*+algorithms to specify millions, billions, etc. in languages.++The `Text.Numerals.Languages` module exports for each implemented language its+algorithm, this makes working with multiple languages more convienient. Under+this module there are dedicated modules per language that do not only export the+algorithm for that language, but also helper functions and constants.++## `ordinal` is not *safe* Haskell++The package uses the `Data.Vector` module which is not safe, and therefore+`ordinal` is not safe either.++## Contribute++You can contribute by making a pull request on the [*GitHub+repository*](https://github.com/hapytex/ordinal).++You can contact the package maintainer by sending a mail to+[`hapytexeu+gh@gmail.com`](mailto:hapytexeu+gh@gmail.com).++---++This package is dedicated to *Wouter Folens* (\* 2019), in the hope that he will+learn about transforming numbers into words.
+ Setup.hs view
@@ -0,0 +1,3 @@+import Distribution.Simple++main = defaultMain
+ ordinal.cabal view
@@ -0,0 +1,74 @@+name:                ordinal+version:             0.1.0.0+synopsis:            Convert numbers to words in different languages.+description:+    A package based on Python's num2words package that converts numbers+    to words in different languages.++    It contains functions and data types to create a numbers-to-words+    algorithm for different languages, and converts numbers both to+    cardinal numbers and ordinal numbers.+homepage:            https://github.com/hapytex/ordinal#readme+license:             BSD3+license-file:        LICENSE+author:              Willem Van Onsem+maintainer:          hapytexteu+gh@gmail.com+copyright:           2020 Willem Van Onsem+category:            utils+build-type:          Simple+extra-source-files:+    README.md+  , CHANGELOG.md+cabal-version:       >=1.10++library+  hs-source-dirs:      src+  exposed-modules:+      Text.Numerals+    , Text.Numerals.Algorithm+    , Text.Numerals.Algorithm.Template+    , Text.Numerals.Class+    , Text.Numerals.Languages+    , Text.Numerals.Languages.Dutch+    , Text.Numerals.Languages.English+    , Text.Numerals.Languages.French+    , Text.Numerals.Prefix+  other-modules:+      Text.Numerals.Internal+  build-depends:+      base >= 4.7 && < 5+    , text >= 0.1+    , template-haskell >=2.15.0.0+    , containers >=0.5+    , vector >= 0.7+  default-language:    Haskell2010++test-suite             cardinal+  type:                exitcode-stdio-1.0+  main-is:             Main.hs+  hs-source-dirs:      test+  other-modules:+      Text.Numerals.LanguageTest+      Text.Numerals.Languages.DutchSpec+      Text.Numerals.Languages.EnglishSpec+      Text.Numerals.Languages.FrenchSpec+  build-depends:+      base+    , ordinal+    , hspec ==2.*+    , QuickCheck >=2.13 && <2.14+    , text >= 0.1+  build-tool-depends: hspec-discover:hspec-discover == 2.*+  default-language:    Haskell2010+  default-extensions:+      BlockArguments+    , OverloadedStrings+  ghc-options:+    -Wall -Wcompat -Wcompat+    -Wincomplete-record-updates+    -Wincomplete-uni-patterns+    -Wredundant-constraints++source-repository head+  type:     git+  location: https://github.com/hapytex/ordinal
+ src/Text/Numerals.hs view
@@ -0,0 +1,21 @@+{-|+Module      : Text.Numerals+Description : The main module that converts numbers to words. This module re-exports a set of modules.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++The main module of the @ordinal@ package. This module re-exports the most important modules of the package to convert numbers to words in the supported languages and functions to construct algorithmic transformations.+-}++module Text.Numerals (+    module Text.Numerals.Algorithm+  , module Text.Numerals.Class+  , module Text.Numerals.Languages+  , module Text.Numerals.Prefix+  ) where++import Text.Numerals.Algorithm+import Text.Numerals.Class+import Text.Numerals.Languages+import Text.Numerals.Prefix
+ src/Text/Numerals/Algorithm.hs view
@@ -0,0 +1,178 @@+{-# LANGUAGE RankNTypes, TupleSections #-}++{-|+Module      : Text.Numerals.Algorithm+Description : A module that contains functions to construct algorithmic conversions from numbers to words.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++A module that contains data types and functions to automatically convert a number to words. It has tooling for a 'NumeralsAlgorithm'+as well as a 'HighNumberAlgorithm' that is used to generate a 'ShortScale' or 'LongScale'.+-}++module Text.Numerals.Algorithm (+    -- * Data types for number algorithms+    NumeralsAlgorithm+  , numeralsAlgorithm+    -- * Large number algorithms+  , HighNumberAlgorithm(ShortScale, LongScale)+  , shortScale, longScale+    -- * Conversion to a 'NumberSegment'+  , toSegments+  , toSegmentLow, toSegmentMid, toSegmentHigh+    -- * Segment compression+  , compressSegments+--  , _toNumberScale+  ) where++import Data.Foldable(toList)+import Data.List(sortOn)+import Data.Maybe(maybe)+import Data.Text(Text, cons)+import Data.Vector(Vector, (!), (!?), fromList)+import qualified Data.Vector as V++import Text.Numerals.Class(NumToWord(toCardinal, toOrdinal), FreeMergerFunction, FreeValueSplitter, MergerFunction, MNumberSegment, NumberSegment(NumberSegment), NumberSegmenting, ValueSplit(valueSplit), ValueSplitter)+import Text.Numerals.Internal(_thousand, _iLogFloor)+import Text.Numerals.Prefix(latinPrefixes)++-- | A data type for algorithmic number to word conversions. Most western+-- languages /likely/ can work with this data type.+data NumeralsAlgorithm = NumeralsAlgorithm {+    minusWord :: Text  -- ^ The word used as prefix to denote negative numbers.+  , oneWord :: Text  -- ^ The word used to denote /one/ in the language.+  , lowWords :: Vector Text  -- ^ A 'Vector' of small numbers, the first item is the word for /two/ and each successor is the word for the next number.+  , midWords :: [(Integer, Text)]  -- ^ A list of 2-tuples where the first item contains the value, and the second the corresponding word, the values are ordered in descending value order.+  , highWords :: FreeValueSplitter  -- ^ A function that is used to generate words for large values (greater than or equal to one /million/), often constructed with the /short scale/ or /long scale/.+  , mergeFunction :: FreeMergerFunction  -- ^ A function that specifies how to merge words based on the grammar of that specific language.+  , ordinize :: Text -> Text  -- ^ A function to conver the /cardinal/ form of a number in an /ordinal/ one.+  }+++instance NumToWord NumeralsAlgorithm where+    toCardinal NumeralsAlgorithm { minusWord=minusWord, oneWord=oneWord, lowWords=lowWords, midWords=midWords, highWords=highWords, mergeFunction=mergeFunction } = cardinal+       where cardinal i+                  | i < 0 = minusWord <> cons ' ' (go (-i))+                  | otherwise = go i+                  where go = compressSegments oneWord mergeFunction . toSegments lowWords midWords highWords++    toOrdinal na@NumeralsAlgorithm { ordinize=ordinize } = ordinize . toCardinal na+++_toNumberScale :: (Integral i, Integral j) => i -> (j, i)+_toNumberScale i = (l, k)+    where ~(_, l, k) = _iLogFloor _thousand i++-- | A data type used for to map larger numbers to words. This data type+-- supports the /short scale/ and /long scale/ with /Latin/ prefixes, and+-- custom suffixes.+data HighNumberAlgorithm+  = ShortScale Text+  | LongScale Text Text+  deriving (Eq, Ord, Read, Show)++-- | Construct a 'FreeValueSplitter' function for the given suffix for a /short scale/.+shortScale :: Text -> FreeValueSplitter+shortScale = valueSplit . ShortScale++-- | Construct a 'FreeValueSplitter' function for the given suffixes for a /long scale/.+longScale :: Text -> Text -> FreeValueSplitter+longScale suf1 = valueSplit . LongScale suf1++_highWithSuffix :: Text -> Int -> Maybe Text+_highWithSuffix suf = fmap (<> suf) . (latinPrefixes !?)++_highToText :: HighNumberAlgorithm -> Int -> Maybe Text+_highToText (ShortScale suf) j = _highWithSuffix suf j+_highToText (LongScale suf1 suf2) j+    | even j = _highWithSuffix suf1 k+    | otherwise = _highWithSuffix suf2 k+    where k = div j 2++instance ValueSplit HighNumberAlgorithm where+    valueSplit vs i = (m,) <$> _highToText vs (j-2)+        where ~(j, m) = _toNumberScale i++-- | A /smart constructor/ for the 'NumeralsAlgorithm' type. This constructor+-- allows one to use an arbitrary 'Foldable' type for the low words and mid+-- words. It will also order the midwords accordingly.+numeralsAlgorithm :: (Foldable f, Foldable g) => Text -> Text -> Text -> f Text -> g (Integer, Text) -> FreeValueSplitter -> FreeMergerFunction -> (Text -> Text) -> NumeralsAlgorithm+numeralsAlgorithm minus zero one lowWords midWords = NumeralsAlgorithm minus one (fromList (zero : one : toList lowWords)) (sortOn (negate . fst) (toList midWords))++_maybeSegment :: Integral i => (i -> NumberSegment i) -> i -> MNumberSegment i+_maybeSegment f = go+    where go 0 = Nothing+          go i = Just (f i)++-- | Convert the given number to a 'NumberSegment' with the given 'Vector' of+-- low numbers. Mid words and large numbers are not taken into account. This+-- is often the next step after the 'toSegmentMid'.+toSegmentLow :: Integral i+  => Vector Text  -- ^ A 'Vector' of low words.+  -> NumberSegmenting i  -- ^ The function that maps the number to the 'NumberSegment'.+toSegmentLow vs = go+    where go i | i >= nvs = NumberSegment (Just (go dv)) nvs lv (tl md)+               | otherwise = NumberSegment Nothing i (vs ! fromIntegral i) Nothing+               where (dv, md) = divMod i nvs+          lv = V.last vs+          nvs = fromIntegral (V.length vs) - 1+          tl = _maybeSegment go++_splitRecurse :: Integral i => (i -> NumberSegment i) -> (i -> NumberSegment i) -> i -> Text -> i -> NumberSegment i+_splitRecurse f g im v j = NumberSegment hd im v (_maybeSegment g md)+    where hd | dv == 1 = Nothing+             | otherwise = Just (f dv)+          ~(dv, md) = divMod j im++-- | Convert the given number to a 'NumberSegment' with the given 'Vector' of+-- low numbers, and the /sorted/ list of mid numbers. Large numbers are not+-- taken into account. This is often the next step after the 'toSegmentHigh'.+toSegmentMid :: Integral i+  => Vector Text  -- ^ A 'Vector' of low words.+  -> [(Integer, Text)]  -- ^ The list of name and the names of these numbers in /descending/ order for the mid words.+  -> NumberSegmenting i  -- ^ The function that maps the number to the 'NumberSegment'.+toSegmentMid lows = go+    where go [] n = toSegmentLow lows n+          go ma@((m, v) : ms) n+              | im > n = goms n+              | otherwise = _splitRecurse (go ma) goms im v n+              where im = fromIntegral m+                    goms = go ms++-- | Convert the given number to a 'NumberSegment' with the given 'Vector' of+-- low numbers, the /sorted/ list of mid numbers, and a 'FreeValueSplitter' for+-- large numbers.+toSegmentHigh :: Integral i+  => Vector Text  -- ^ A 'Vector' of low words.+  -> [(Integer, Text)]  -- ^ The list of name and the names of these numbers in /descending/ order for the mid words.+  -> ValueSplitter i  -- ^ The 'ValueSplitter' used for large numbers, likely a splitter from a /short scale/ or /long scale/.+  -> NumberSegmenting i  -- ^ The function that maps the number to the 'NumberSegment'.+toSegmentHigh lows mids highs = go+    where go v | Just (i, t) <- highs v = _splitRecurse go go i t v+               | otherwise = toSegmentMid lows mids v++-- | Convert the given number to a 'NumberSegment' with the given 'Vector' of+-- low numbers, the /sorted/ list of mid numbers, and a 'FreeValueSplitter' for+-- large numbers.+toSegments :: Integral i+  => Vector Text  -- ^ A 'Vector' of low words.+  -> [(Integer, Text)]  -- ^ The list of name and the names of these numbers in /descending/ order for the mid words.+  -> ValueSplitter i  -- ^ The 'ValueSplitter' used for large numbers, likely a splitter from a /short scale/ or /long scale/.+  -> NumberSegmenting i  -- ^ The function that maps the number to the 'NumberSegment'.+toSegments = toSegmentHigh++-- | Use the given 'MergerFunction' to compress the 'NumberSegment' to a single+-- 'Text' object that represents the given number.+compressSegments :: Integral i+  => Text  -- ^ The value used for /one/ in the specific language.+  -> MergerFunction i  -- ^ The 'MergerFunction' for the specific language that implements the grammar rules how to merge values.+  -> NumberSegment i  -- ^ The given 'NumberSegment' value to turn into a 'Text' object.+  -> Text  -- ^ The 'Text' object that contains the name of the number stored in the 'NumberSegment'.+compressSegments one' merger = snd . go+    where go (NumberSegment dv' i t md') = _mergeTail md' (dvi * i, merger dvi i dv t)+              where (dvi, dv) = _unwrap dv'+          _unwrap = maybe (1, one') go+          _mergeTail Nothing r = r+          _mergeTail (Just md') (vi, v) = (vi + mdi, merger vi mdi v md)+              where (mdi, md) = go md'
+ src/Text/Numerals/Algorithm/Template.hs view
@@ -0,0 +1,65 @@+{-# LANGUAGE TemplateHaskellQuotes #-}++{-|+Module      : Text.Numerals.Algorithm.Template+Description : A module that constructs template Haskell to make defining an ordinize function more convenient.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++The module is designed to construct an 'Exp' based on the mapping data provided. It will check if the text object+ends with the given suffix, and replace the suffix with another suffix. It aims to compile this into an efficient function.+-}++module Text.Numerals.Algorithm.Template (+    ordinizeFromDict+  ) where++import Data.Map.Strict(Map, elems, fromListWith)+import Data.Text(isSuffixOf, pack, snoc)++import Text.Numerals.Internal(_replaceSuffix)++import Language.Haskell.TH(Body(GuardedB), Clause(Clause), Dec(FunD), Exp(AppE, ConE, LitE, VarE), Guard(NormalG), Lit(CharL, IntegerL, StringL), Name, Pat(VarP), mkName)++_getPrefix :: [Char] -> [Char] -> (Int, [Char])+_getPrefix [] bs = (0, bs)+_getPrefix aa@(a:as) ba@(b:bs)+     | a == b = _getPrefix as bs+     | otherwise = (length aa, ba)++_orCondition :: [Exp] -> Guard+_orCondition [] = NormalG (ConE 'False)+_orCondition xs = NormalG (foldr1 (AppE . AppE (VarE '(||))) xs)++_packText :: String -> Exp+_packText = AppE (VarE 'pack) . LitE . StringL++_packExp :: Int -> String -> Exp -> Exp+_packExp 0 [] nm = nm+_packExp 0 [s] nm = AppE (AppE (VarE 'snoc) nm) (LitE (CharL s))+_packExp 0 sc nm = AppE (AppE (VarE '(<>)) nm) (_packText sc)+_packExp l sc nm = AppE (AppE (AppE (VarE '_replaceSuffix) (LitE (IntegerL (fromIntegral l)))) (_packText sc)) nm++_ordinizeSingle :: Exp -> String -> String -> ((Int, String), ([Exp], Exp))+_ordinizeSingle nm sa sb = (p, ([AppE (AppE (VarE 'isSuffixOf) (_packText sa)) nm], _packExp l sc nm))+    where p@(l, sc) = _getPrefix sa sb++_ordinizeMap :: Exp -> [(String, String)] -> Map (Int, String) ([Exp], Exp)+_ordinizeMap n = fromListWith f . map (uncurry (_ordinizeSingle n))+    where f (as, a) (bs, _) = (bs ++ as, a)++_toGuard :: ([Exp], Exp) -> (Guard, Exp)+_toGuard (gs, es) = (_orCondition gs, es)++-- | Construct a function with the given name that maps suffixes in the first+-- item of the 2-tuples to the second item of the 2-tuples. It turns this into a+-- declaration.+ordinizeFromDict+  :: String  -- ^ The name of the function, often this is just @ordinize'@+  -> [(String, String)]  -- ^ The list of suffixes and their corresponding mapping, the suffixes should be non-overlapping.+  -> Name  -- ^ The name of the post-processing function in case there was no match, one can for example use 'id'.+  -> Dec  -- ^ The corresponding declaration.+ordinizeFromDict nm ts pp = FunD (mkName nm) [Clause [VarP t] (GuardedB (map _toGuard (elems (_ordinizeMap t' ts)) ++ [(NormalG (ConE 'True), AppE (VarE pp) t')])) []]+    where t = mkName "t"+          t' = VarE t
+ src/Text/Numerals/Class.hs view
@@ -0,0 +1,100 @@+{-# LANGUAGE DeriveFunctor, DeriveFoldable, RankNTypes, Safe #-}++{-|+Module      : Text.Numerals.Class+Description : A module that contains the typeclasses on which the rest of the module works.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++A module that defines the typeclasses that are used in the rest of the module. The 'NumToWord' class+is the typeclass that is used by all algorithmic conversion tools.+-}++module Text.Numerals.Class (+    -- * Typeclasses+    NumToWord(toCardinal, toOrdinal, toWords)+  , ValueSplit(valueSplit)+    -- * Types of numbers+  , NumberType(Cardinal, Ordinal)+    -- * Segmenting a number+  , NumberSegment(NumberSegment, segmentDivision, segmentValue, segmentText, segmentRemainder)+  , MNumberSegment+    -- * Utility type synonyms+  , MergerFunction, FreeMergerFunction, ValueSplitter, FreeValueSplitter, NumberSegmenting+  ) where++import Data.Text(Text)++-- | A type alias of a function that is used to merge the names of two numbers according+-- to gramatical rules. The type parameter is the type of the numbers to merge.+type MergerFunction i = i -> i -> Text -> Text -> Text++-- | A type alias of a 'MergerFunction' function with a free 'Integral' variable.+type FreeMergerFunction = forall i . Integral i => MergerFunction i++-- | A type alias of a function that maps a number to a 2-tuple that contains a+-- number and the word for that number. This number is normally the largest+-- number smaller than the given number. In case no name exists for a number+-- smaller than the given one 'Nothing' is returned.+type ValueSplitter i = i -> Maybe (i, Text)++-- | A type alias of a 'ValueSplitter' function, with a free 'Integral'+-- variable.+type FreeValueSplitter = forall i . Integral i => ValueSplitter i++-- | A type alias of a function that converts a number to a 'NumberSegment' for that number.+type NumberSegmenting i = i -> NumberSegment i++-- | A data type used to convert a number into segments. Each segment has an+-- optional division and remainder part, together with a value and the name of+-- that value in a language.+data NumberSegment i = NumberSegment {+    segmentDivision :: MNumberSegment i  -- ^ The optional division part. 'Nothing' if the division is equal to one.+  , segmentValue :: i  -- ^ The value of the given segment.+  , segmentText :: Text  -- ^ The name of the value of the given segment, in a specific language.+  , segmentRemainder ::  MNumberSegment i  -- ^ The optional remainder part. 'Nothing' if the remainder is equal to zero.+  } deriving (Foldable, Functor, Eq, Ord, Read, Show)++-- | A 'Maybe' variant of the 'NumberSegment' data type. This is used since the+-- division part can be one, or the remainder part can be zero.+type MNumberSegment i = Maybe (NumberSegment i)++-- | A data type that specifies the different types of numbers. These can be+-- used to specify the "target format".+data NumberType+  = Cardinal  -- ^ /Cardinal/ numbers like one, two, three, etc.+  | Ordinal  -- ^ /Ordinal/ numbers like first, second, third, etc.+  deriving (Bounded, Enum, Eq, Ord)++-- | A type class used for num to word algorithms. It maps an 'Integral' type+-- @i@ to 'Text'.+class NumToWord a where+    -- | Convert the given number to a 'Text' object that is the given number in+    -- words.+    toCardinal :: Integral i+      => a  -- ^ The conversion algorithm that transforms the number into words.+      -> i  -- ^ The number to transform into a /cardinal/ form.+      -> Text  -- ^ The number in words in a /cardinal/ form.+    toCardinal = toWords Cardinal+    toOrdinal :: Integral i+      => a  -- ^ The conversion algorithm that transforms the number into words.+      -> i  -- ^ The number to transform into a /ordinal/ form.+      -> Text  -- ^ The number in words in a /ordinal/ form.+    toOrdinal = toWords Ordinal+    toWords :: Integral i+      => NumberType  -- ^ The given format to convert the number to.+      -> a  -- ^ The conversion algorithm that transforms the number into words.+      -> i  -- ^ The number to transform into the given form.+      -> Text  -- ^ The number in words in the given form.+    toWords Cardinal = toCardinal+    toWords Ordinal = toOrdinal+    {-# MINIMAL toCardinal, toOrdinal | toWords #-}++-- | A type class used to split a value, based on the name of a number in a+-- specific language. The value that is used to split, is often, depending on+-- the language, the largest value smaller than the given number.+class ValueSplit a where+    -- | A function that takes an 'Integral' value, and based on the object+    -- splits it with a value and the name of the number in a specific language.+    valueSplit :: a -> FreeValueSplitter
+ src/Text/Numerals/Internal.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE NumericUnderscores, Safe #-}++module Text.Numerals.Internal (+    _div10, _rem10, _divisableBy, _divisable100+  , _showText+  , _mergeWith, _mergeWithSpace, _mergeWithHyphen, _mergeWith', _replaceSuffix+  , _hundred, _thousand, _million, _billion, _trillion+  , _iLog, _iLogFloor+  , _stripLastIf+  ) where++import Data.Text(Text, cons, dropEnd, isSuffixOf, singleton, pack)+import qualified Data.Text as T++_stripLastIf :: Char -> Text -> Text+_stripLastIf c t+    | singleton c `isSuffixOf` t = T.init t+    | otherwise = t++_mergeWith' :: Char -> Text -> Text -> Text+_mergeWith' m = (. cons m) . (<>)++_mergeWithSpace :: Text -> Text -> Text+_mergeWithSpace = _mergeWith' ' '++_mergeWithHyphen :: Text -> Text -> Text+_mergeWithHyphen = _mergeWith' '-'++_mergeWith :: Text -> Text -> Text -> Text+_mergeWith m = (<>) . (<> m)++_showText :: Show a => a -> Text+_showText = pack . show++_divisableBy :: Integral i => i -> i -> Bool+_divisableBy n = (0 ==) . (`mod` n)++_divisable100 :: Integral i => i -> Bool+_divisable100 = _divisableBy _hundred++_div10 :: Integral i => i -> i+_div10 = (`div` _ten)++_rem10 :: Integral i => i -> i+_rem10 = (`rem` _ten)++_ten :: Integral i => i+_ten = 10++_hundred :: Integral i => i+_hundred = 100++_thousand :: Integral i => i+_thousand = 1000++_million :: Integral i => i+_million = 1_000_000++_billion :: Integral i => i+_billion = 1_000_000_000++_trillion :: Integral i => i+_trillion = 1_000_000_000_000++_iLogFloor :: (Integral i, Integral j) => i -> i -> (i, j, i)+_iLogFloor b m = go b+  where go i | m < i = (m, 0, 1)+             | q < i = (q, 2 * e, j)+             | otherwise = (div q i, 2 * e + 1, j * i)+            where ~(q, e, j) = go (i*i)++_iLog :: (Integral i, Integral j) => i -> i -> Maybe j+_iLog b m = snd <$> go b+  where go i | m < i = Just (m, 0)+             | Just (q, e) <- go (i*i) = go' i q e+             | otherwise = Nothing+        go' i q e | q < i = Just (q, 2 * e)+                  | m == 0 = Just (d, 2 * e + 1)+                  | otherwise = Nothing+            where (d, m) = divMod q i++_replaceSuffix :: Int -> Text -> Text -> Text+_replaceSuffix n s = (<> s) . dropEnd n
+ src/Text/Numerals/Languages.hs view
@@ -0,0 +1,17 @@+{-|+Module      : Text.Numerals.Languages+Description : A module that re-exports the algorithms to convert numbers to words in the supported languages.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++This module imports the /num to word/ algorithms and re-exports these algorithms. The module thus can be used to conveniently import algorithms for all supported languages.+-}++module Text.Numerals.Languages (+    dutch, english, french+  ) where++import Text.Numerals.Languages.Dutch(dutch)+import Text.Numerals.Languages.English(english)+import Text.Numerals.Languages.French(french)
+ src/Text/Numerals/Languages/Dutch.hs view
@@ -0,0 +1,147 @@+{-# LANGUAGE OverloadedLists, OverloadedStrings, TemplateHaskell #-}++{-|+Module      : Text.Numerals.Languages.Dutch+Description : A module to convert numbers to words in the /Dutch/ language.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++This module contains logic to convert numbers to words in the /Dutch/ language.+-}++module Text.Numerals.Languages.Dutch (+    -- * Num to word algorithm+    dutch+    -- * Convert to ordinal+  , ordinize'+    -- * Constant words+  , negativeWord', zeroWord', oneWord'+    -- * Names for numbers+  , lowWords', midWords', highWords'+    -- * Merge function+  , merge'+  ) where++import Data.Text(Text, snoc)+import Data.Vector(Vector)++import Text.Numerals.Algorithm(HighNumberAlgorithm(LongScale), NumeralsAlgorithm, numeralsAlgorithm)+import Text.Numerals.Algorithm.Template(ordinizeFromDict)+import Text.Numerals.Class(valueSplit)+import Text.Numerals.Internal(_million, _mergeWithSpace)++$(pure [ordinizeFromDict "_ordinize'" [+    ("nul", "nuld")+  , ("één", "eerst")+  , ("twee", "tweed")+  , ("drie", "derd")+  , ("vier", "vierd")+  , ("vijf", "vijfd")+  , ("zes", "zesd")+  , ("zeven", "zevend")+  , ("acht", "achtst")+  , ("negen", "negend")+  , ("tien", "tiend")+  , ("elf", "elfd")+  , ("twaalf", "twaalfd")+  , ("ig", "igst")+  , ("erd", "erdst")+  , ("end", "endst")+  , ("joen", "joenst")+  , ("rd", "rdst")+  ] 'id])++-- | A function that converts a number in words in /cardinal/ form to /ordinal/+-- form according to the /Dutch/ language rules.+ordinize' :: Text -> Text+ordinize' = (`snoc` 'e') . _ordinize'++-- | A 'NumeralsAlgorithm' to convert numbers to words in the /Dutch/ language.+dutch :: NumeralsAlgorithm  -- ^ A 'NumeralsAlgorithm' that can be used to convert numbers to different formats.+dutch = numeralsAlgorithm negativeWord' zeroWord' oneWord' lowWords' midWords' (valueSplit highWords') merge' ordinize'++-- | The words used to mark a negative number in the /Dutch/ language.+negativeWord' :: Text+negativeWord' = "min"++-- | The word used for the number /zero/ in the /Dutch/ language.+zeroWord' :: Text+zeroWord' = "nul"++-- | The word used for the number /one/ in the /Dutch/ language.+oneWord' :: Text+oneWord' = "één"++-- | A 'Vector' that contains the word used for the numbers /two/ to /twenty/ in the /Dutch/ language.+lowWords' :: Vector Text+lowWords' = [+    "twee"+  , "drie"+  , "vier"+  , "vijf"+  , "zes"+  , "zeven"+  , "acht"+  , "negen"+  , "tien"+  , "elf"+  , "twaalf"+  , "dertien"+  , "veertien"+  , "vijftien"+  , "zestien"+  , "zeventien"+  , "achttien"+  , "negentien"+  , "twintig"+  ]++-- | A list of 2-tuples that contains the names of values between /thirty/ and+-- /thousand/ in the /Dutch/ language.+midWords' :: [(Integer, Text)]+midWords' = [+    (1000, "duizend")+  , (100, "honderd")+  , (90, "negentig")+  , (80, "tachtig")+  , (70, "zeventig")+  , (60, "zestig")+  , (50, "vijftig")+  , (40, "veertig")+  , (30, "dertig")+  ]++_rightAnd :: Integral i => i -> Text -> Text+_rightAnd 1 = const "een"+_rightAnd _ = id++_leftAnd :: Integral i => i -> Text -> Text+_leftAnd 1 = const "eenen"+_leftAnd n | 2 <- n = addE+           | 3 <- n = addE+           | otherwise = (<> "en")+           where addE = (<> "ën")++-- | A merge function that is used to combine the names of words together to+-- larger words, according to the /Dutch/ grammar rules.+merge' :: Integral i => i -> i -> Text -> Text -> Text+merge' 1 r+    | r < _million = const id+    | otherwise = const (_merge' 1 r "een")+merge' l r = _merge' l r++_merge' :: Integral i => i -> i -> Text -> Text -> Text+_merge' l r+    | r > l && r >= _million = _mergeWithSpace+    | r > l = (<>)+    | r < 10 && 10 < l && l < 100 = go+    | l >= _million = _mergeWithSpace+    | otherwise = (<>)+    where go tl tr = _leftAnd r tr <> _rightAnd l tl++-- | An algorithm to obtain the names of /large/ numbers (one million or larger)+-- in /Dutch/. Dutch uses a /long scale/ with the @iljoen@ and @iljard@+-- suffixes.+highWords' :: HighNumberAlgorithm+highWords' = LongScale "iljoen" "iljard"
+ src/Text/Numerals/Languages/English.hs view
@@ -0,0 +1,124 @@+{-# LANGUAGE OverloadedLists, OverloadedStrings, TemplateHaskell #-}++{-|+Module      : Text.Numerals.Languages.English+Description : A module to convert numbers to words in the /English/ language.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++This module contains logic to convert numbers to words in the /English/ language.+-}++module Text.Numerals.Languages.English (+    -- * Num to word algorithm+    english+    -- * Convert to ordinal+  , ordinize'+    -- * Constant words+  , negativeWord', zeroWord', oneWord'+    -- * Names for numbers+  , lowWords', midWords', highWords'+    -- * Merge function+  , merge'+  ) where++import Data.Text(Text, isSuffixOf)+import qualified Data.Text as T+import Data.Vector(Vector)++import Text.Numerals.Algorithm(HighNumberAlgorithm(ShortScale), NumeralsAlgorithm, numeralsAlgorithm)+import Text.Numerals.Algorithm.Template(ordinizeFromDict)+import Text.Numerals.Class(valueSplit)+import Text.Numerals.Internal(_mergeWith, _mergeWithSpace, _mergeWithHyphen)++_ordinizepp :: Text -> Text+_ordinizepp t+    | "y" `isSuffixOf` t = T.init t <> "ieth"+    | otherwise = t <> "th"++-- | A function that converts a number in words in /cardinal/ form to /ordinal/+-- form according to the /English/ language rules.+$(pure [ordinizeFromDict "ordinize'" [+    ("one", "first")+  , ("two", "second")+  , ("three", "third")+  , ("four", "fourth")+  , ("five", "fifth")+  , ("six", "sixth")+  , ("seven", "seventh")+  , ("eight", "eighth")+  , ("nine", "ninth")+  , ("ten", "tenth")+  , ("eleven", "eleventh")+  , ("twelve", "twelfth")+  ] '_ordinizepp])++-- | A 'NumeralsAlgorithm' to convert numbers to words in the /English/ language.+english :: NumeralsAlgorithm  -- ^ A 'NumeralsAlgorithm' that can be used to convert numbers to different formats.+english = numeralsAlgorithm negativeWord' zeroWord' oneWord' lowWords' midWords' (valueSplit highWords') merge' ordinize'++-- | The words used to mark a negative number in the /English/ language.+negativeWord' :: Text+negativeWord' = "minus"++-- | The word used for the number /zero/ in the /English/ language.+zeroWord' :: Text+zeroWord' = "zero"++-- | The word used for the number /one/ in the /English/ language.+oneWord' :: Text+oneWord' = "one"++-- | A 'Vector' that contains the word used for the numbers /two/ to /twenty/ in the /English/ language.+lowWords' :: Vector Text+lowWords' = [+    "two"+  , "three"+  , "four"+  , "five"+  , "six"+  , "seven"+  , "eight"+  , "nine"+  , "ten"+  , "eleven"+  , "twelve"+  , "thirteen"+  , "fourteen"+  , "fifteen"+  , "sixteen"+  , "seventeen"+  , "eighteen"+  , "nineteen"+  , "twenty"+  ]++-- | A list of 2-tuples that contains the names of values between /thirty/ and+-- /thousand/ in the /English/ language.+midWords' :: [(Integer, Text)]+midWords' = [+    (1000, "thousand")+  , (100, "hundred")+  , (90, "ninety")+  , (80, "eighty")+  , (70, "seventy")+  , (60, "sixty")+  , (50, "fifty")+  , (40, "forty")+  , (30, "thirty")+  ]++-- | A merge function that is used to combine the names of words together to+-- larger words, according to the /English/ grammar rules.+merge' :: Integral i => i -> i -> Text -> Text -> Text+merge' 1 r | r < 100 = const id+merge' l r | 100 > l && l > r = _mergeWithHyphen+           | l >= 100 && 100 > r = _mergeWith " and "+           | r > l = _mergeWithSpace+merge' _ _ = _mergeWith ", "++-- | An algorithm to obtain the names of /large/ numbers (one million or larger)+-- in /English/. English uses a /short scale/ with the @illion@ suffix.+highWords' :: HighNumberAlgorithm+highWords' = ShortScale "illion"
+ src/Text/Numerals/Languages/French.hs view
@@ -0,0 +1,125 @@+{-# LANGUAGE OverloadedLists, OverloadedStrings, TemplateHaskell #-}++{-|+Module      : Text.Numerals.Languages.French+Description : A module to convert numbers to words in the /French/ language.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++This module contains logic to convert numbers to words in the /French/ language.+-}++module Text.Numerals.Languages.French (+    -- * Num to word algorithm+    french+    -- * Convert to ordinal+  , ordinize'+    -- * Constant words+  , negativeWord', zeroWord', oneWord'+    -- * Names for numbers+  , lowWords', midWords', highWords'+    -- * Merge function+  , merge'+  ) where++import Data.Text(Text, isSuffixOf, snoc)+import qualified Data.Text as T+import Data.Vector(Vector)++import Text.Numerals.Algorithm(HighNumberAlgorithm(LongScale), NumeralsAlgorithm, numeralsAlgorithm)+import Text.Numerals.Algorithm.Template(ordinizeFromDict)+import Text.Numerals.Class(FreeMergerFunction, valueSplit)+import Text.Numerals.Internal(_divisable100, _mergeWith, _mergeWithSpace, _mergeWithHyphen, _million, _stripLastIf, _thousand)++$(pure [ordinizeFromDict "_ordinize'" [+    ("cinq", "cinqu")+  , ("neuf", "neuv")+  ] 'id])++-- | A 'NumeralsAlgorithm' to convert numbers to words in the /French/ language.+french :: NumeralsAlgorithm  -- ^ A 'NumeralsAlgorithm' that can be used to convert numbers to different formats.+french = numeralsAlgorithm negativeWord' zeroWord' oneWord' lowWords' midWords' (valueSplit highWords') merge' ordinize'++-- | The words used to mark a negative number in the /French/ language.+negativeWord' :: Text+negativeWord' = "moins"++-- | The word used for the number /zero/ in the /French/ language.+zeroWord' :: Text+zeroWord' = "zéro"++-- | The word used for the number /one/ in the /French/ language.+oneWord' :: Text+oneWord' = "un"++-- | A 'Vector' that contains the word used for the numbers /two/ to /twenty/ in the /French/ language.+lowWords' :: Vector Text+lowWords' = [+    "deux"+  , "trois"+  , "quatre"+  , "cinq"+  , "six"+  , "sept"+  , "huit"+  , "neuf"+  , "dix"+  , "onze"+  , "douze"+  , "treize"+  , "quatorze"+  , "quinze"+  , "seize"+  , "dix-sept"+  , "dix-huit"+  , "dix-neuf"+  , "vingt"+  ]++-- | A list of 2-tuples that contains the names of values between /thirty/ and+-- /thousand/ in the /French/ language.+midWords' :: [(Integer, Text)]+midWords' = [+    (1000, "mille")+  , (100, "cent")+  , (80, "quatre-vingts")+  , (60, "soixante")+  , (50, "cinquante")+  , (40, "quarante")+  , (30, "trente")+  ]++-- | A merge function that is used to combine the names of words together to+-- larger words, according to the /French/ grammar rules.+merge' :: FreeMergerFunction+merge' 1 r | r < _million = const id+           | otherwise = _merge' 1 r+merge' l r = \ta tb -> _merge' l r (_firstWithoutS l r ta) (_secondWithS l r tb)++_firstWithoutS :: Integral i => i -> i -> Text -> Text+_firstWithoutS l r t+    | (_divisable100 (l + 20) || (_divisable100 l && l < _thousand)) && r < _million = _stripLastIf 's' t+    | otherwise = t++_secondWithS :: Integral i => i -> i -> Text -> Text+_secondWithS l r t+    | l < _thousand && r /= _thousand && _divisable100 r && not ("s" `isSuffixOf` t) = snoc t 's'+    | otherwise = t++_merge' :: Integral i => i -> i -> Text -> Text -> Text+_merge' l r | r >= l || l >= 100 = _mergeWithSpace+            | r `mod` 10 == 1 && l /= 80 = _mergeWith " et "+            | otherwise = _mergeWithHyphen++-- | A function that converts a number in words in /cardinal/ form to /ordinal/+-- form according to the /French/ language rules.+ordinize' :: Text -> Text+ordinize' "un" = "premier"+ordinize' t = _stripLastIf 'e' (_ordinize' t) <> "ième"++-- | An algorithm to obtain the names of /large/ numbers (one million or larger)+-- in /French/. French uses a /long scale/ with the @illion@ and @illiard@+-- suffixes.+highWords' :: HighNumberAlgorithm+highWords' =  LongScale "illion" "illiard"
+ src/Text/Numerals/Prefix.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE OverloadedStrings #-}++{-|+Module      : Text.Numerals.Prefix+Description : A module used to define /numeric prefixes/ for /long/ and /short scales/.+Maintainer  : hapytexeu+gh@gmail.com+Stability   : experimental+Portability : POSIX++A module that defines /Latin/ prefixes. These prefixes are used to construct names for the /long/ and /short scales/.+So the /m/, /b/, /tr/ in /million/, /billion/, /trillion/.+-}++module Text.Numerals.Prefix (+    -- * Latin prefixes+    latinPrefixes, latinPrefixes', latinPrefix+  ) where++import Data.Text(Text)+import Data.Vector(Vector, (!?), fromList)++-- | A list of /Latin/ prefixes, used for the /long/ and /short scale/.+latinPrefixes' :: [Text]  -- ^ A list of 'Text' objects. This makes explicit recursion more convenient.+latinPrefixes' = [+    "m"+  , "b"+  , "tr"+  , "quadr"+  , "quint"+  , "sext"+  , "sept"+  , "oct"+  , "non"+  , "dec"+  , "undec"+  , "duodec"+  , "tredec"+  , "quattuordec"+  , "quindec"+  , "sexdec"+  , "septended"+  , "octodec"+  , "novemdec"+  , "vigint"+  ]++-- | The /Latin/ prefixes in a 'Vector' for /O(1)/ lookup.+latinPrefixes :: Vector Text  -- ^ A 'Vector' of 'Text' objects to allow fast lookup.+latinPrefixes = fromList latinPrefixes'++-- | Lookup the given /Latin/ prefix for the given value.+latinPrefix :: Integral i+  => i  -- ^ The value to map on a Latin prefix.+  -> Maybe Text  -- ^ The corresponding Latin prefix, given this exists.+latinPrefix n = latinPrefixes !? (fromIntegral n - 1)
+ test/Main.hs view
@@ -0,0 +1,3 @@+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}+-- cabal v2-test --test-show-details=direct+-- cabal v2-test --test-show-details=direct --test-options="--color --format=progress"
+ test/Text/Numerals/LanguageTest.hs view
@@ -0,0 +1,36 @@+module Text.Numerals.LanguageTest (+    testLanguage+  ) where++import Data.Text(Text)++import Test.Hspec(SpecWith, describe, it, shouldBe)+import Test.QuickCheck(property)++import Text.Numerals.Class(toCardinal, toOrdinal)+import Text.Numerals.Algorithm(NumeralsAlgorithm)++testDifferCardinal :: NumeralsAlgorithm -> Integer -> Integer -> Bool+testDifferCardinal al n1 n2 = n1 == n2 || toCardinal al n1 /= toCardinal al n2++testDifferOrdinal :: NumeralsAlgorithm -> Integer -> Integer -> Bool+testDifferOrdinal al n1 n2 = n1 == n2 || toOrdinal al n1 /= toOrdinal al n2++testDifferCardinalOrdinal :: NumeralsAlgorithm -> Integer -> Bool+testDifferCardinalOrdinal al n = toCardinal al n /= toOrdinal al n++testDifferCardinalOrdinal' :: NumeralsAlgorithm -> Integer -> Integer -> Bool+testDifferCardinalOrdinal' al n1 n2 = toCardinal al n1 /= toOrdinal al n2++testNumberConversion :: (Integer -> Text) -> Integer -> Text -> SpecWith ()+testNumberConversion f n t = it (show n) (f n `shouldBe` t)++testLanguage :: String -> NumeralsAlgorithm -> [(Integer, Text)] -> [(Integer, Text)] -> SpecWith ()+testLanguage languageName al cs os = describe languageName $ do+    describe "Automatied tests" $ do+        it "Different cardinal names" (property (testDifferCardinal al))+        it "Different ordinal names" (property (testDifferOrdinal al))+        it "Difference between cardinal and ordinal names" (property (testDifferCardinalOrdinal al))+        it "Difference between cardinal and ordinal names with different number" (property (testDifferCardinalOrdinal' al))+    describe "Test cardinal numbers" (mapM_ (uncurry (testNumberConversion (toCardinal al))) cs)+    describe "Test ordinal numbers" (mapM_ (uncurry (testNumberConversion (toOrdinal al))) os)
+ test/Text/Numerals/Languages/DutchSpec.hs view
@@ -0,0 +1,622 @@+module Text.Numerals.Languages.DutchSpec (+    spec+  ) where++import Data.Text(Text)++import Test.Hspec(Spec)+import Text.Numerals.Languages.Dutch(dutch)+import Text.Numerals.LanguageTest(testLanguage)++spec :: Spec+spec = testLanguage "Dutch" dutch cardinals ordinals++cardinals :: [(Integer, Text)]+cardinals = [+    (0, "nul")+  , (1, "één")+  , (2, "twee")+  , (3, "drie")+  , (4, "vier")+  , (5, "vijf")+  , (6, "zes")+  , (7, "zeven")+  , (8, "acht")+  , (9, "negen")+  , (10, "tien")+  , (11, "elf")+  , (12, "twaalf")+  , (13, "dertien")+  , (14, "veertien")+  , (15, "vijftien")+  , (16, "zestien")+  , (17, "zeventien")+  , (18, "achttien")+  , (19, "negentien")+  , (20, "twintig")+  , (21, "eenentwintig")+  , (22, "tweeëntwintig")+  , (23, "drieëntwintig")+  , (24, "vierentwintig")+  , (25, "vijfentwintig")+  , (26, "zesentwintig")+  , (27, "zevenentwintig")+  , (28, "achtentwintig")+  , (29, "negenentwintig")+  , (30, "dertig")+  , (31, "eenendertig")+  , (32, "tweeëndertig")+  , (33, "drieëndertig")+  , (34, "vierendertig")+  , (35, "vijfendertig")+  , (36, "zesendertig")+  , (37, "zevenendertig")+  , (38, "achtendertig")+  , (39, "negenendertig")+  , (40, "veertig")+  , (41, "eenenveertig")+  , (42, "tweeënveertig")+  , (43, "drieënveertig")+  , (44, "vierenveertig")+  , (45, "vijfenveertig")+  , (46, "zesenveertig")+  , (47, "zevenenveertig")+  , (48, "achtenveertig")+  , (49, "negenenveertig")+  , (50, "vijftig")+  , (51, "eenenvijftig")+  , (52, "tweeënvijftig")+  , (53, "drieënvijftig")+  , (54, "vierenvijftig")+  , (55, "vijfenvijftig")+  , (56, "zesenvijftig")+  , (57, "zevenenvijftig")+  , (58, "achtenvijftig")+  , (59, "negenenvijftig")+  , (60, "zestig")+  , (61, "eenenzestig")+  , (62, "tweeënzestig")+  , (63, "drieënzestig")+  , (64, "vierenzestig")+  , (65, "vijfenzestig")+  , (66, "zesenzestig")+  , (67, "zevenenzestig")+  , (68, "achtenzestig")+  , (69, "negenenzestig")+  , (70, "zeventig")+  , (71, "eenenzeventig")+  , (72, "tweeënzeventig")+  , (73, "drieënzeventig")+  , (74, "vierenzeventig")+  , (75, "vijfenzeventig")+  , (76, "zesenzeventig")+  , (77, "zevenenzeventig")+  , (78, "achtenzeventig")+  , (79, "negenenzeventig")+  , (80, "tachtig")+  , (81, "eenentachtig")+  , (82, "tweeëntachtig")+  , (83, "drieëntachtig")+  , (84, "vierentachtig")+  , (85, "vijfentachtig")+  , (86, "zesentachtig")+  , (87, "zevenentachtig")+  , (88, "achtentachtig")+  , (89, "negenentachtig")+  , (90, "negentig")+  , (91, "eenennegentig")+  , (92, "tweeënnegentig")+  , (93, "drieënnegentig")+  , (94, "vierennegentig")+  , (95, "vijfennegentig")+  , (96, "zesennegentig")+  , (97, "zevenennegentig")+  , (98, "achtennegentig")+  , (99, "negenennegentig")+  , (100, "honderd")+  , (101, "honderdéén")+  , (102, "honderdtwee")+  , (103, "honderddrie")+  , (104, "honderdvier")+  , (105, "honderdvijf")+  , (106, "honderdzes")+  , (107, "honderdzeven")+  , (108, "honderdacht")+  , (109, "honderdnegen")+  , (110, "honderdtien")+  , (111, "honderdelf")+  , (112, "honderdtwaalf")+  , (113, "honderddertien")+  , (114, "honderdveertien")+  , (115, "honderdvijftien")+  , (116, "honderdzestien")+  , (117, "honderdzeventien")+  , (118, "honderdachttien")+  , (119, "honderdnegentien")+  , (120, "honderdtwintig")+  , (121, "honderdeenentwintig")+  , (122, "honderdtweeëntwintig")+  , (123, "honderddrieëntwintig")+  , (124, "honderdvierentwintig")+  , (125, "honderdvijfentwintig")+  , (126, "honderdzesentwintig")+  , (127, "honderdzevenentwintig")+  , (128, "honderdachtentwintig")+  , (129, "honderdnegenentwintig")+  , (130, "honderddertig")+  , (131, "honderdeenendertig")+  , (132, "honderdtweeëndertig")+  , (133, "honderddrieëndertig")+  , (134, "honderdvierendertig")+  , (135, "honderdvijfendertig")+  , (136, "honderdzesendertig")+  , (137, "honderdzevenendertig")+  , (138, "honderdachtendertig")+  , (139, "honderdnegenendertig")+  , (140, "honderdveertig")+  , (141, "honderdeenenveertig")+  , (142, "honderdtweeënveertig")+  , (143, "honderddrieënveertig")+  , (144, "honderdvierenveertig")+  , (145, "honderdvijfenveertig")+  , (146, "honderdzesenveertig")+  , (147, "honderdzevenenveertig")+  , (148, "honderdachtenveertig")+  , (149, "honderdnegenenveertig")+  , (150, "honderdvijftig")+  , (151, "honderdeenenvijftig")+  , (152, "honderdtweeënvijftig")+  , (153, "honderddrieënvijftig")+  , (154, "honderdvierenvijftig")+  , (155, "honderdvijfenvijftig")+  , (156, "honderdzesenvijftig")+  , (157, "honderdzevenenvijftig")+  , (158, "honderdachtenvijftig")+  , (159, "honderdnegenenvijftig")+  , (160, "honderdzestig")+  , (161, "honderdeenenzestig")+  , (162, "honderdtweeënzestig")+  , (163, "honderddrieënzestig")+  , (164, "honderdvierenzestig")+  , (165, "honderdvijfenzestig")+  , (166, "honderdzesenzestig")+  , (167, "honderdzevenenzestig")+  , (168, "honderdachtenzestig")+  , (169, "honderdnegenenzestig")+  , (170, "honderdzeventig")+  , (171, "honderdeenenzeventig")+  , (172, "honderdtweeënzeventig")+  , (173, "honderddrieënzeventig")+  , (174, "honderdvierenzeventig")+  , (175, "honderdvijfenzeventig")+  , (176, "honderdzesenzeventig")+  , (177, "honderdzevenenzeventig")+  , (178, "honderdachtenzeventig")+  , (179, "honderdnegenenzeventig")+  , (180, "honderdtachtig")+  , (181, "honderdeenentachtig")+  , (182, "honderdtweeëntachtig")+  , (183, "honderddrieëntachtig")+  , (184, "honderdvierentachtig")+  , (185, "honderdvijfentachtig")+  , (186, "honderdzesentachtig")+  , (187, "honderdzevenentachtig")+  , (188, "honderdachtentachtig")+  , (189, "honderdnegenentachtig")+  , (190, "honderdnegentig")+  , (191, "honderdeenennegentig")+  , (192, "honderdtweeënnegentig")+  , (193, "honderddrieënnegentig")+  , (194, "honderdvierennegentig")+  , (195, "honderdvijfennegentig")+  , (196, "honderdzesennegentig")+  , (197, "honderdzevenennegentig")+  , (198, "honderdachtennegentig")+  , (199, "honderdnegenennegentig")+  , (200, "tweehonderd")+  , (233, "tweehonderddrieëndertig")+  , (377, "driehonderdzevenenzeventig")+  , (610, "zeshonderdtien")+  , (987, "negenhonderdzevenentachtig")+  , (1597, "duizendvijfhonderdzevenennegentig")+  , (2584, "tweeduizendvijfhonderdvierentachtig")+  , (4181, "vierduizendhonderdeenentachtig")+  , (6765, "zesduizendzevenhonderdvijfenzestig")+  , (10946, "tienduizendnegenhonderdzesenveertig")+  , (17711, "zeventienduizendzevenhonderdelf")+  , (28657, "achtentwintigduizendzeshonderdzevenenvijftig")+  , (46368, "zesenveertigduizenddriehonderdachtenzestig")+  , (75025, "vijfenzeventigduizendvijfentwintig")+  , (121393, "honderdeenentwintigduizenddriehonderddrieënnegentig")+  , (196418, "honderdzesennegentigduizendvierhonderdachttien")+  , (317811, "driehonderdzeventienduizendachthonderdelf")+  , (514229, "vijfhonderdveertienduizendtweehonderdnegenentwintig")+  , (832040, "achthonderdtweeëndertigduizendveertig")+  , (1346269, "een miljoen driehonderdzesenveertigduizendtweehonderdnegenenzestig")+  , (2178309, "twee miljoen honderdachtenzeventigduizenddriehonderdnegen")+  , (3524578, "drie miljoen vijfhonderdvierentwintigduizendvijfhonderdachtenzeventig")+  , (5702887, "vijf miljoen zevenhonderdtweeduizendachthonderdzevenentachtig")+  , (9227465, "negen miljoen tweehonderdzevenentwintigduizendvierhonderdvijfenzestig")+  , (14930352, "veertien miljoen negenhonderddertigduizenddriehonderdtweeënvijftig")+  , (24157817, "vierentwintig miljoen honderdzevenenvijftigduizendachthonderdzeventien")+  , (39088169, "negenendertig miljoen achtentachtigduizendhonderdnegenenzestig")+  , (63245986, "drieënzestig miljoen tweehonderdvijfenveertigduizendnegenhonderdzesentachtig")+  , (102334155, "honderdtwee miljoen driehonderdvierendertigduizendhonderdvijfenvijftig")+  , (165580141, "honderdvijfenzestig miljoen vijfhonderdtachtigduizendhonderdeenenveertig")+  , (267914296, "tweehonderdzevenenzestig miljoen negenhonderdveertienduizendtweehonderdzesennegentig")+  , (433494437, "vierhonderddrieëndertig miljoen vierhonderdvierennegentigduizendvierhonderdzevenendertig")+  , (701408733, "zevenhonderdéén miljoen vierhonderdachtduizendzevenhonderddrieëndertig")+  , (1134903170, "een miljard honderdvierendertig miljoen negenhonderddrieduizendhonderdzeventig")+  , (1836311903, "een miljard achthonderdzesendertig miljoen driehonderdelfduizendnegenhonderddrie")+  , (2971215073, "twee miljard negenhonderdeenenzeventig miljoen tweehonderdvijftienduizenddrieënzeventig")+  , (4807526976, "vier miljard achthonderdzeven miljoen vijfhonderdzesentwintigduizendnegenhonderdzesenzeventig")+  , (7778742049, "zeven miljard zevenhonderdachtenzeventig miljoen zevenhonderdtweeënveertigduizendnegenenveertig")+  , (12586269025, "twaalf miljard vijfhonderdzesentachtig miljoen tweehonderdnegenenzestigduizendvijfentwintig")+  , (20365011074, "twintig miljard driehonderdvijfenzestig miljoen elfduizendvierenzeventig")+  , (32951280099, "tweeëndertig miljard negenhonderdeenenvijftig miljoen tweehonderdtachtigduizendnegenennegentig")+  , (53316291173, "drieënvijftig miljard driehonderdzestien miljoen tweehonderdeenennegentigduizendhonderddrieënzeventig")+  , (86267571272, "zesentachtig miljard tweehonderdzevenenzestig miljoen vijfhonderdeenenzeventigduizendtweehonderdtweeënzeventig")+  , (139583862445, "honderdnegenendertig miljard vijfhonderddrieëntachtig miljoen achthonderdtweeënzestigduizendvierhonderdvijfenveertig")+  , (225851433717, "tweehonderdvijfentwintig miljard achthonderdeenenvijftig miljoen vierhonderddrieëndertigduizendzevenhonderdzeventien")+  , (365435296162, "driehonderdvijfenzestig miljard vierhonderdvijfendertig miljoen tweehonderdzesennegentigduizendhonderdtweeënzestig")+  , (591286729879, "vijfhonderdeenennegentig miljard tweehonderdzesentachtig miljoen zevenhonderdnegenentwintigduizendachthonderdnegenenzeventig")+  , (956722026041, "negenhonderdzesenvijftig miljard zevenhonderdtweeëntwintig miljoen zesentwintigduizendeenenveertig")+  , (1548008755920, "een biljoen vijfhonderdachtenveertig miljard acht miljoen zevenhonderdvijfenvijftigduizendnegenhonderdtwintig")+  , (2504730781961, "twee biljoen vijfhonderdvier miljard zevenhonderddertig miljoen zevenhonderdeenentachtigduizendnegenhonderdeenenzestig")+  , (4052739537881, "vier biljoen tweeënvijftig miljard zevenhonderdnegenendertig miljoen vijfhonderdzevenendertigduizendachthonderdeenentachtig")+  , (6557470319842, "zes biljoen vijfhonderdzevenenvijftig miljard vierhonderdzeventig miljoen driehonderdnegentienduizendachthonderdtweeënveertig")+  , (10610209857723, "tien biljoen zeshonderdtien miljard tweehonderdnegen miljoen achthonderdzevenenvijftigduizendzevenhonderddrieëntwintig")+  , (17167680177565, "zeventien biljoen honderdzevenenzestig miljard zeshonderdtachtig miljoen honderdzevenenzeventigduizendvijfhonderdvijfenzestig")+  , (27777890035288, "zevenentwintig biljoen zevenhonderdzevenenzeventig miljard achthonderdnegentig miljoen vijfendertigduizendtweehonderdachtentachtig")+  , (44945570212853, "vierenveertig biljoen negenhonderdvijfenveertig miljard vijfhonderdzeventig miljoen tweehonderdtwaalfduizendachthonderddrieënvijftig")+  , (72723460248141, "tweeënzeventig biljoen zevenhonderddrieëntwintig miljard vierhonderdzestig miljoen tweehonderdachtenveertigduizendhonderdeenenveertig")+  , (117669030460994, "honderdzeventien biljoen zeshonderdnegenenzestig miljard dertig miljoen vierhonderdzestigduizendnegenhonderdvierennegentig")+  , (190392490709135, "honderdnegentig biljoen driehonderdtweeënnegentig miljard vierhonderdnegentig miljoen zevenhonderdnegenduizendhonderdvijfendertig")+  , (308061521170129, "driehonderdacht biljoen eenenzestig miljard vijfhonderdeenentwintig miljoen honderdzeventigduizendhonderdnegenentwintig")+  , (498454011879264, "vierhonderdachtennegentig biljoen vierhonderdvierenvijftig miljard elf miljoen achthonderdnegenenzeventigduizendtweehonderdvierenzestig")+  , (806515533049393, "achthonderdzes biljoen vijfhonderdvijftien miljard vijfhonderddrieëndertig miljoen negenenveertigduizenddriehonderddrieënnegentig")+  , (1304969544928657, "een biljard driehonderdvier biljoen negenhonderdnegenenzestig miljard vijfhonderdvierenveertig miljoen negenhonderdachtentwintigduizendzeshonderdzevenenvijftig")+  , (2111485077978050, "twee biljard honderdelf biljoen vierhonderdvijfentachtig miljard zevenenzeventig miljoen negenhonderdachtenzeventigduizendvijftig")+  , (3416454622906707, "drie biljard vierhonderdzestien biljoen vierhonderdvierenvijftig miljard zeshonderdtweeëntwintig miljoen negenhonderdzesduizendzevenhonderdzeven")+  , (5527939700884757, "vijf biljard vijfhonderdzevenentwintig biljoen negenhonderdnegenendertig miljard zevenhonderd miljoen achthonderdvierentachtigduizendzevenhonderdzevenenvijftig")+  , (8944394323791464, "acht biljard negenhonderdvierenveertig biljoen driehonderdvierennegentig miljard driehonderddrieëntwintig miljoen zevenhonderdeenennegentigduizendvierhonderdvierenzestig")+  , (14472334024676221, "veertien biljard vierhonderdtweeënzeventig biljoen driehonderdvierendertig miljard vierentwintig miljoen zeshonderdzesenzeventigduizendtweehonderdeenentwintig")+  , (23416728348467685, "drieëntwintig biljard vierhonderdzestien biljoen zevenhonderdachtentwintig miljard driehonderdachtenveertig miljoen vierhonderdzevenenzestigduizendzeshonderdvijfentachtig")+  , (37889062373143906, "zevenendertig biljard achthonderdnegenentachtig biljoen tweeënzestig miljard driehonderddrieënzeventig miljoen honderddrieënveertigduizendnegenhonderdzes")+  , (61305790721611591, "eenenzestig biljard driehonderdvijf biljoen zevenhonderdnegentig miljard zevenhonderdeenentwintig miljoen zeshonderdelfduizendvijfhonderdeenennegentig")+  , (99194853094755497, "negenennegentig biljard honderdvierennegentig biljoen achthonderddrieënvijftig miljard vierennegentig miljoen zevenhonderdvijfenvijftigduizendvierhonderdzevenennegentig")+  , (160500643816367088, "honderdzestig biljard vijfhonderd biljoen zeshonderddrieënveertig miljard achthonderdzestien miljoen driehonderdzevenenzestigduizendachtentachtig")+  , (259695496911122585, "tweehonderdnegenenvijftig biljard zeshonderdvijfennegentig biljoen vierhonderdzesennegentig miljard negenhonderdelf miljoen honderdtweeëntwintigduizendvijfhonderdvijfentachtig")+  , (420196140727489673, "vierhonderdtwintig biljard honderdzesennegentig biljoen honderdveertig miljard zevenhonderdzevenentwintig miljoen vierhonderdnegenentachtigduizendzeshonderddrieënzeventig")+  , (679891637638612258, "zeshonderdnegenenzeventig biljard achthonderdeenennegentig biljoen zeshonderdzevenendertig miljard zeshonderdachtendertig miljoen zeshonderdtwaalfduizendtweehonderdachtenvijftig")+  , (1100087778366101931, "een triljoen honderd biljard zevenentachtig biljoen zevenhonderdachtenzeventig miljard driehonderdzesenzestig miljoen honderdéénduizendnegenhonderdeenendertig")+  , (1779979416004714189, "een triljoen zevenhonderdnegenenzeventig biljard negenhonderdnegenenzeventig biljoen vierhonderdzestien miljard vier miljoen zevenhonderdveertienduizendhonderdnegenentachtig")+  , (2880067194370816120, "twee triljoen achthonderdtachtig biljard zevenenzestig biljoen honderdvierennegentig miljard driehonderdzeventig miljoen achthonderdzestienduizendhonderdtwintig")+  , (4660046610375530309, "vier triljoen zeshonderdzestig biljard zesenveertig biljoen zeshonderdtien miljard driehonderdvijfenzeventig miljoen vijfhonderddertigduizenddriehonderdnegen")+  , (7540113804746346429, "zeven triljoen vijfhonderdveertig biljard honderddertien biljoen achthonderdvier miljard zevenhonderdzesenveertig miljoen driehonderdzesenveertigduizendvierhonderdnegenentwintig")+  , (12200160415121876738, "twaalf triljoen tweehonderd biljard honderdzestig biljoen vierhonderdvijftien miljard honderdeenentwintig miljoen achthonderdzesenzeventigduizendzevenhonderdachtendertig")+  , (19740274219868223167, "negentien triljoen zevenhonderdveertig biljard tweehonderdvierenzeventig biljoen tweehonderdnegentien miljard achthonderdachtenzestig miljoen tweehonderddrieëntwintigduizendhonderdzevenenzestig")+  , (31940434634990099905, "eenendertig triljoen negenhonderdveertig biljard vierhonderdvierendertig biljoen zeshonderdvierendertig miljard negenhonderdnegentig miljoen negenennegentigduizendnegenhonderdvijf")+  , (51680708854858323072, "eenenvijftig triljoen zeshonderdtachtig biljard zevenhonderdacht biljoen achthonderdvierenvijftig miljard achthonderdachtenvijftig miljoen driehonderddrieëntwintigduizendtweeënzeventig")+  , (83621143489848422977, "drieëntachtig triljoen zeshonderdeenentwintig biljard honderddrieënveertig biljoen vierhonderdnegenentachtig miljard achthonderdachtenveertig miljoen vierhonderdtweeëntwintigduizendnegenhonderdzevenenzeventig")+  , (135301852344706746049, "honderdvijfendertig triljoen driehonderdéén biljard achthonderdtweeënvijftig biljoen driehonderdvierenveertig miljard zevenhonderdzes miljoen zevenhonderdzesenveertigduizendnegenenveertig")+  , (218922995834555169026, "tweehonderdachttien triljoen negenhonderdtweeëntwintig biljard negenhonderdvijfennegentig biljoen achthonderdvierendertig miljard vijfhonderdvijfenvijftig miljoen honderdnegenenzestigduizendzesentwintig")+  , (354224848179261915075, "driehonderdvierenvijftig triljoen tweehonderdvierentwintig biljard achthonderdachtenveertig biljoen honderdnegenenzeventig miljard tweehonderdeenenzestig miljoen negenhonderdvijftienduizendvijfenzeventig")+  , (573147844013817084101, "vijfhonderddrieënzeventig triljoen honderdzevenenveertig biljard achthonderdvierenveertig biljoen dertien miljard achthonderdzeventien miljoen vierentachtigduizendhonderdéén")+  , (927372692193078999176, "negenhonderdzevenentwintig triljoen driehonderdtweeënzeventig biljard zeshonderdtweeënnegentig biljoen honderddrieënnegentig miljard achtenzeventig miljoen negenhonderdnegenennegentigduizendhonderdzesenzeventig")+  , (1500520536206896083277, "een triljard vijfhonderd triljoen vijfhonderdtwintig biljard vijfhonderdzesendertig biljoen tweehonderdzes miljard achthonderdzesennegentig miljoen drieëntachtigduizendtweehonderdzevenenzeventig")+  , (2427893228399975082453, "twee triljard vierhonderdzevenentwintig triljoen achthonderddrieënnegentig biljard tweehonderdachtentwintig biljoen driehonderdnegenennegentig miljard negenhonderdvijfenzeventig miljoen tweeëntachtigduizendvierhonderddrieënvijftig")+  , (3928413764606871165730, "drie triljard negenhonderdachtentwintig triljoen vierhonderddertien biljard zevenhonderdvierenzestig biljoen zeshonderdzes miljard achthonderdeenenzeventig miljoen honderdvijfenzestigduizendzevenhonderddertig")+  , (6356306993006846248183, "zes triljard driehonderdzesenvijftig triljoen driehonderdzes biljard negenhonderddrieënnegentig biljoen zes miljard achthonderdzesenveertig miljoen tweehonderdachtenveertigduizendhonderddrieëntachtig")+  , (10284720757613717413913, "tien triljard tweehonderdvierentachtig triljoen zevenhonderdtwintig biljard zevenhonderdzevenenvijftig biljoen zeshonderddertien miljard zevenhonderdzeventien miljoen vierhonderddertienduizendnegenhonderddertien")+  , (16641027750620563662096, "zestien triljard zeshonderdeenenveertig triljoen zevenentwintig biljard zevenhonderdvijftig biljoen zeshonderdtwintig miljard vijfhonderddrieënzestig miljoen zeshonderdtweeënzestigduizendzesennegentig")+  , (26925748508234281076009, "zesentwintig triljard negenhonderdvijfentwintig triljoen zevenhonderdachtenveertig biljard vijfhonderdacht biljoen tweehonderdvierendertig miljard tweehonderdeenentachtig miljoen zesenzeventigduizendnegen")+  , (43566776258854844738105, "drieënveertig triljard vijfhonderdzesenzestig triljoen zevenhonderdzesenzeventig biljard tweehonderdachtenvijftig biljoen achthonderdvierenvijftig miljard achthonderdvierenveertig miljoen zevenhonderdachtendertigduizendhonderdvijf")+  , (70492524767089125814114, "zeventig triljard vierhonderdtweeënnegentig triljoen vijfhonderdvierentwintig biljard zevenhonderdzevenenzestig biljoen negenentachtig miljard honderdvijfentwintig miljoen achthonderdveertienduizendhonderdveertien")+  , (114059301025943970552219, "honderdveertien triljard negenenvijftig triljoen driehonderdéén biljard vijfentwintig biljoen negenhonderddrieënveertig miljard negenhonderdzeventig miljoen vijfhonderdtweeënvijftigduizendtweehonderdnegentien")+  ]++ordinals :: [(Integer, Text)]+ordinals = [+    (0, "nulde")+  , (1, "eerste")+  , (2, "tweede")+  , (3, "derde")+  , (4, "vierde")+  , (5, "vijfde")+  , (6, "zesde")+  , (7, "zevende")+  , (8, "achtste")+  , (9, "negende")+  , (10, "tiende")+  , (11, "elfde")+  , (12, "twaalfde")+  , (13, "dertiende")+  , (14, "veertiende")+  , (15, "vijftiende")+  , (16, "zestiende")+  , (17, "zeventiende")+  , (18, "achttiende")+  , (19, "negentiende")+  , (20, "twintigste")+  , (21, "eenentwintigste")+  , (22, "tweeëntwintigste")+  , (23, "drieëntwintigste")+  , (24, "vierentwintigste")+  , (25, "vijfentwintigste")+  , (26, "zesentwintigste")+  , (27, "zevenentwintigste")+  , (28, "achtentwintigste")+  , (29, "negenentwintigste")+  , (30, "dertigste")+  , (31, "eenendertigste")+  , (32, "tweeëndertigste")+  , (33, "drieëndertigste")+  , (34, "vierendertigste")+  , (35, "vijfendertigste")+  , (36, "zesendertigste")+  , (37, "zevenendertigste")+  , (38, "achtendertigste")+  , (39, "negenendertigste")+  , (40, "veertigste")+  , (41, "eenenveertigste")+  , (42, "tweeënveertigste")+  , (43, "drieënveertigste")+  , (44, "vierenveertigste")+  , (45, "vijfenveertigste")+  , (46, "zesenveertigste")+  , (47, "zevenenveertigste")+  , (48, "achtenveertigste")+  , (49, "negenenveertigste")+  , (50, "vijftigste")+  , (51, "eenenvijftigste")+  , (52, "tweeënvijftigste")+  , (53, "drieënvijftigste")+  , (54, "vierenvijftigste")+  , (55, "vijfenvijftigste")+  , (56, "zesenvijftigste")+  , (57, "zevenenvijftigste")+  , (58, "achtenvijftigste")+  , (59, "negenenvijftigste")+  , (60, "zestigste")+  , (61, "eenenzestigste")+  , (62, "tweeënzestigste")+  , (63, "drieënzestigste")+  , (64, "vierenzestigste")+  , (65, "vijfenzestigste")+  , (66, "zesenzestigste")+  , (67, "zevenenzestigste")+  , (68, "achtenzestigste")+  , (69, "negenenzestigste")+  , (70, "zeventigste")+  , (71, "eenenzeventigste")+  , (72, "tweeënzeventigste")+  , (73, "drieënzeventigste")+  , (74, "vierenzeventigste")+  , (75, "vijfenzeventigste")+  , (76, "zesenzeventigste")+  , (77, "zevenenzeventigste")+  , (78, "achtenzeventigste")+  , (79, "negenenzeventigste")+  , (80, "tachtigste")+  , (81, "eenentachtigste")+  , (82, "tweeëntachtigste")+  , (83, "drieëntachtigste")+  , (84, "vierentachtigste")+  , (85, "vijfentachtigste")+  , (86, "zesentachtigste")+  , (87, "zevenentachtigste")+  , (88, "achtentachtigste")+  , (89, "negenentachtigste")+  , (90, "negentigste")+  , (91, "eenennegentigste")+  , (92, "tweeënnegentigste")+  , (93, "drieënnegentigste")+  , (94, "vierennegentigste")+  , (95, "vijfennegentigste")+  , (96, "zesennegentigste")+  , (97, "zevenennegentigste")+  , (98, "achtennegentigste")+  , (99, "negenennegentigste")+  , (100, "honderdste")+  , (101, "honderdeerste")+  , (102, "honderdtweede")+  , (103, "honderdderde")+  , (104, "honderdvierde")+  , (105, "honderdvijfde")+  , (106, "honderdzesde")+  , (107, "honderdzevende")+  , (108, "honderdachtste")+  , (109, "honderdnegende")+  , (110, "honderdtiende")+  , (111, "honderdelfde")+  , (112, "honderdtwaalfde")+  , (113, "honderddertiende")+  , (114, "honderdveertiende")+  , (115, "honderdvijftiende")+  , (116, "honderdzestiende")+  , (117, "honderdzeventiende")+  , (118, "honderdachttiende")+  , (119, "honderdnegentiende")+  , (120, "honderdtwintigste")+  , (121, "honderdeenentwintigste")+  , (122, "honderdtweeëntwintigste")+  , (123, "honderddrieëntwintigste")+  , (124, "honderdvierentwintigste")+  , (125, "honderdvijfentwintigste")+  , (126, "honderdzesentwintigste")+  , (127, "honderdzevenentwintigste")+  , (128, "honderdachtentwintigste")+  , (129, "honderdnegenentwintigste")+  , (130, "honderddertigste")+  , (131, "honderdeenendertigste")+  , (132, "honderdtweeëndertigste")+  , (133, "honderddrieëndertigste")+  , (134, "honderdvierendertigste")+  , (135, "honderdvijfendertigste")+  , (136, "honderdzesendertigste")+  , (137, "honderdzevenendertigste")+  , (138, "honderdachtendertigste")+  , (139, "honderdnegenendertigste")+  , (140, "honderdveertigste")+  , (141, "honderdeenenveertigste")+  , (142, "honderdtweeënveertigste")+  , (143, "honderddrieënveertigste")+  , (144, "honderdvierenveertigste")+  , (145, "honderdvijfenveertigste")+  , (146, "honderdzesenveertigste")+  , (147, "honderdzevenenveertigste")+  , (148, "honderdachtenveertigste")+  , (149, "honderdnegenenveertigste")+  , (150, "honderdvijftigste")+  , (151, "honderdeenenvijftigste")+  , (152, "honderdtweeënvijftigste")+  , (153, "honderddrieënvijftigste")+  , (154, "honderdvierenvijftigste")+  , (155, "honderdvijfenvijftigste")+  , (156, "honderdzesenvijftigste")+  , (157, "honderdzevenenvijftigste")+  , (158, "honderdachtenvijftigste")+  , (159, "honderdnegenenvijftigste")+  , (160, "honderdzestigste")+  , (161, "honderdeenenzestigste")+  , (162, "honderdtweeënzestigste")+  , (163, "honderddrieënzestigste")+  , (164, "honderdvierenzestigste")+  , (165, "honderdvijfenzestigste")+  , (166, "honderdzesenzestigste")+  , (167, "honderdzevenenzestigste")+  , (168, "honderdachtenzestigste")+  , (169, "honderdnegenenzestigste")+  , (170, "honderdzeventigste")+  , (171, "honderdeenenzeventigste")+  , (172, "honderdtweeënzeventigste")+  , (173, "honderddrieënzeventigste")+  , (174, "honderdvierenzeventigste")+  , (175, "honderdvijfenzeventigste")+  , (176, "honderdzesenzeventigste")+  , (177, "honderdzevenenzeventigste")+  , (178, "honderdachtenzeventigste")+  , (179, "honderdnegenenzeventigste")+  , (180, "honderdtachtigste")+  , (181, "honderdeenentachtigste")+  , (182, "honderdtweeëntachtigste")+  , (183, "honderddrieëntachtigste")+  , (184, "honderdvierentachtigste")+  , (185, "honderdvijfentachtigste")+  , (186, "honderdzesentachtigste")+  , (187, "honderdzevenentachtigste")+  , (188, "honderdachtentachtigste")+  , (189, "honderdnegenentachtigste")+  , (190, "honderdnegentigste")+  , (191, "honderdeenennegentigste")+  , (192, "honderdtweeënnegentigste")+  , (193, "honderddrieënnegentigste")+  , (194, "honderdvierennegentigste")+  , (195, "honderdvijfennegentigste")+  , (196, "honderdzesennegentigste")+  , (197, "honderdzevenennegentigste")+  , (198, "honderdachtennegentigste")+  , (199, "honderdnegenennegentigste")+  , (200, "tweehonderdste")+  , (233, "tweehonderddrieëndertigste")+  , (377, "driehonderdzevenenzeventigste")+  , (610, "zeshonderdtiende")+  , (987, "negenhonderdzevenentachtigste")+  , (1597, "duizendvijfhonderdzevenennegentigste")+  , (2584, "tweeduizendvijfhonderdvierentachtigste")+  , (4181, "vierduizendhonderdeenentachtigste")+  , (6765, "zesduizendzevenhonderdvijfenzestigste")+  , (10946, "tienduizendnegenhonderdzesenveertigste")+  , (17711, "zeventienduizendzevenhonderdelfde")+  , (28657, "achtentwintigduizendzeshonderdzevenenvijftigste")+  , (46368, "zesenveertigduizenddriehonderdachtenzestigste")+  , (75025, "vijfenzeventigduizendvijfentwintigste")+  , (121393, "honderdeenentwintigduizenddriehonderddrieënnegentigste")+  , (196418, "honderdzesennegentigduizendvierhonderdachttiende")+  , (317811, "driehonderdzeventienduizendachthonderdelfde")+  , (514229, "vijfhonderdveertienduizendtweehonderdnegenentwintigste")+  , (832040, "achthonderdtweeëndertigduizendveertigste")+  , (1346269, "een miljoen driehonderdzesenveertigduizendtweehonderdnegenenzestigste")+  , (2178309, "twee miljoen honderdachtenzeventigduizenddriehonderdnegende")+  , (3524578, "drie miljoen vijfhonderdvierentwintigduizendvijfhonderdachtenzeventigste")+  , (5702887, "vijf miljoen zevenhonderdtweeduizendachthonderdzevenentachtigste")+  , (9227465, "negen miljoen tweehonderdzevenentwintigduizendvierhonderdvijfenzestigste")+  , (14930352, "veertien miljoen negenhonderddertigduizenddriehonderdtweeënvijftigste")+  , (24157817, "vierentwintig miljoen honderdzevenenvijftigduizendachthonderdzeventiende")+  , (39088169, "negenendertig miljoen achtentachtigduizendhonderdnegenenzestigste")+  , (63245986, "drieënzestig miljoen tweehonderdvijfenveertigduizendnegenhonderdzesentachtigste")+  , (102334155, "honderdtwee miljoen driehonderdvierendertigduizendhonderdvijfenvijftigste")+  , (165580141, "honderdvijfenzestig miljoen vijfhonderdtachtigduizendhonderdeenenveertigste")+  , (267914296, "tweehonderdzevenenzestig miljoen negenhonderdveertienduizendtweehonderdzesennegentigste")+  , (433494437, "vierhonderddrieëndertig miljoen vierhonderdvierennegentigduizendvierhonderdzevenendertigste")+  , (701408733, "zevenhonderdéén miljoen vierhonderdachtduizendzevenhonderddrieëndertigste")+  , (1134903170, "een miljard honderdvierendertig miljoen negenhonderddrieduizendhonderdzeventigste")+  , (1836311903, "een miljard achthonderdzesendertig miljoen driehonderdelfduizendnegenhonderdderde")+  , (2971215073, "twee miljard negenhonderdeenenzeventig miljoen tweehonderdvijftienduizenddrieënzeventigste")+  , (4807526976, "vier miljard achthonderdzeven miljoen vijfhonderdzesentwintigduizendnegenhonderdzesenzeventigste")+  , (7778742049, "zeven miljard zevenhonderdachtenzeventig miljoen zevenhonderdtweeënveertigduizendnegenenveertigste")+  , (12586269025, "twaalf miljard vijfhonderdzesentachtig miljoen tweehonderdnegenenzestigduizendvijfentwintigste")+  , (20365011074, "twintig miljard driehonderdvijfenzestig miljoen elfduizendvierenzeventigste")+  , (32951280099, "tweeëndertig miljard negenhonderdeenenvijftig miljoen tweehonderdtachtigduizendnegenennegentigste")+  , (53316291173, "drieënvijftig miljard driehonderdzestien miljoen tweehonderdeenennegentigduizendhonderddrieënzeventigste")+  , (86267571272, "zesentachtig miljard tweehonderdzevenenzestig miljoen vijfhonderdeenenzeventigduizendtweehonderdtweeënzeventigste")+  , (139583862445, "honderdnegenendertig miljard vijfhonderddrieëntachtig miljoen achthonderdtweeënzestigduizendvierhonderdvijfenveertigste")+  , (225851433717, "tweehonderdvijfentwintig miljard achthonderdeenenvijftig miljoen vierhonderddrieëndertigduizendzevenhonderdzeventiende")+  , (365435296162, "driehonderdvijfenzestig miljard vierhonderdvijfendertig miljoen tweehonderdzesennegentigduizendhonderdtweeënzestigste")+  , (591286729879, "vijfhonderdeenennegentig miljard tweehonderdzesentachtig miljoen zevenhonderdnegenentwintigduizendachthonderdnegenenzeventigste")+  , (956722026041, "negenhonderdzesenvijftig miljard zevenhonderdtweeëntwintig miljoen zesentwintigduizendeenenveertigste")+  , (1548008755920, "een biljoen vijfhonderdachtenveertig miljard acht miljoen zevenhonderdvijfenvijftigduizendnegenhonderdtwintigste")+  , (2504730781961, "twee biljoen vijfhonderdvier miljard zevenhonderddertig miljoen zevenhonderdeenentachtigduizendnegenhonderdeenenzestigste")+  , (4052739537881, "vier biljoen tweeënvijftig miljard zevenhonderdnegenendertig miljoen vijfhonderdzevenendertigduizendachthonderdeenentachtigste")+  , (6557470319842, "zes biljoen vijfhonderdzevenenvijftig miljard vierhonderdzeventig miljoen driehonderdnegentienduizendachthonderdtweeënveertigste")+  , (10610209857723, "tien biljoen zeshonderdtien miljard tweehonderdnegen miljoen achthonderdzevenenvijftigduizendzevenhonderddrieëntwintigste")+  , (17167680177565, "zeventien biljoen honderdzevenenzestig miljard zeshonderdtachtig miljoen honderdzevenenzeventigduizendvijfhonderdvijfenzestigste")+  , (27777890035288, "zevenentwintig biljoen zevenhonderdzevenenzeventig miljard achthonderdnegentig miljoen vijfendertigduizendtweehonderdachtentachtigste")+  , (44945570212853, "vierenveertig biljoen negenhonderdvijfenveertig miljard vijfhonderdzeventig miljoen tweehonderdtwaalfduizendachthonderddrieënvijftigste")+  , (72723460248141, "tweeënzeventig biljoen zevenhonderddrieëntwintig miljard vierhonderdzestig miljoen tweehonderdachtenveertigduizendhonderdeenenveertigste")+  , (117669030460994, "honderdzeventien biljoen zeshonderdnegenenzestig miljard dertig miljoen vierhonderdzestigduizendnegenhonderdvierennegentigste")+  , (190392490709135, "honderdnegentig biljoen driehonderdtweeënnegentig miljard vierhonderdnegentig miljoen zevenhonderdnegenduizendhonderdvijfendertigste")+  , (308061521170129, "driehonderdacht biljoen eenenzestig miljard vijfhonderdeenentwintig miljoen honderdzeventigduizendhonderdnegenentwintigste")+  , (498454011879264, "vierhonderdachtennegentig biljoen vierhonderdvierenvijftig miljard elf miljoen achthonderdnegenenzeventigduizendtweehonderdvierenzestigste")+  , (806515533049393, "achthonderdzes biljoen vijfhonderdvijftien miljard vijfhonderddrieëndertig miljoen negenenveertigduizenddriehonderddrieënnegentigste")+  , (1304969544928657, "een biljard driehonderdvier biljoen negenhonderdnegenenzestig miljard vijfhonderdvierenveertig miljoen negenhonderdachtentwintigduizendzeshonderdzevenenvijftigste")+  , (2111485077978050, "twee biljard honderdelf biljoen vierhonderdvijfentachtig miljard zevenenzeventig miljoen negenhonderdachtenzeventigduizendvijftigste")+  , (3416454622906707, "drie biljard vierhonderdzestien biljoen vierhonderdvierenvijftig miljard zeshonderdtweeëntwintig miljoen negenhonderdzesduizendzevenhonderdzevende")+  , (5527939700884757, "vijf biljard vijfhonderdzevenentwintig biljoen negenhonderdnegenendertig miljard zevenhonderd miljoen achthonderdvierentachtigduizendzevenhonderdzevenenvijftigste")+  , (8944394323791464, "acht biljard negenhonderdvierenveertig biljoen driehonderdvierennegentig miljard driehonderddrieëntwintig miljoen zevenhonderdeenennegentigduizendvierhonderdvierenzestigste")+  , (14472334024676221, "veertien biljard vierhonderdtweeënzeventig biljoen driehonderdvierendertig miljard vierentwintig miljoen zeshonderdzesenzeventigduizendtweehonderdeenentwintigste")+  , (23416728348467685, "drieëntwintig biljard vierhonderdzestien biljoen zevenhonderdachtentwintig miljard driehonderdachtenveertig miljoen vierhonderdzevenenzestigduizendzeshonderdvijfentachtigste")+  , (37889062373143906, "zevenendertig biljard achthonderdnegenentachtig biljoen tweeënzestig miljard driehonderddrieënzeventig miljoen honderddrieënveertigduizendnegenhonderdzesde")+  , (61305790721611591, "eenenzestig biljard driehonderdvijf biljoen zevenhonderdnegentig miljard zevenhonderdeenentwintig miljoen zeshonderdelfduizendvijfhonderdeenennegentigste")+  , (99194853094755497, "negenennegentig biljard honderdvierennegentig biljoen achthonderddrieënvijftig miljard vierennegentig miljoen zevenhonderdvijfenvijftigduizendvierhonderdzevenennegentigste")+  , (160500643816367088, "honderdzestig biljard vijfhonderd biljoen zeshonderddrieënveertig miljard achthonderdzestien miljoen driehonderdzevenenzestigduizendachtentachtigste")+  , (259695496911122585, "tweehonderdnegenenvijftig biljard zeshonderdvijfennegentig biljoen vierhonderdzesennegentig miljard negenhonderdelf miljoen honderdtweeëntwintigduizendvijfhonderdvijfentachtigste")+  , (420196140727489673, "vierhonderdtwintig biljard honderdzesennegentig biljoen honderdveertig miljard zevenhonderdzevenentwintig miljoen vierhonderdnegenentachtigduizendzeshonderddrieënzeventigste")+  , (679891637638612258, "zeshonderdnegenenzeventig biljard achthonderdeenennegentig biljoen zeshonderdzevenendertig miljard zeshonderdachtendertig miljoen zeshonderdtwaalfduizendtweehonderdachtenvijftigste")+  , (1100087778366101931, "een triljoen honderd biljard zevenentachtig biljoen zevenhonderdachtenzeventig miljard driehonderdzesenzestig miljoen honderdéénduizendnegenhonderdeenendertigste")+  , (1779979416004714189, "een triljoen zevenhonderdnegenenzeventig biljard negenhonderdnegenenzeventig biljoen vierhonderdzestien miljard vier miljoen zevenhonderdveertienduizendhonderdnegenentachtigste")+  , (2880067194370816120, "twee triljoen achthonderdtachtig biljard zevenenzestig biljoen honderdvierennegentig miljard driehonderdzeventig miljoen achthonderdzestienduizendhonderdtwintigste")+  , (4660046610375530309, "vier triljoen zeshonderdzestig biljard zesenveertig biljoen zeshonderdtien miljard driehonderdvijfenzeventig miljoen vijfhonderddertigduizenddriehonderdnegende")+  , (7540113804746346429, "zeven triljoen vijfhonderdveertig biljard honderddertien biljoen achthonderdvier miljard zevenhonderdzesenveertig miljoen driehonderdzesenveertigduizendvierhonderdnegenentwintigste")+  , (12200160415121876738, "twaalf triljoen tweehonderd biljard honderdzestig biljoen vierhonderdvijftien miljard honderdeenentwintig miljoen achthonderdzesenzeventigduizendzevenhonderdachtendertigste")+  , (19740274219868223167, "negentien triljoen zevenhonderdveertig biljard tweehonderdvierenzeventig biljoen tweehonderdnegentien miljard achthonderdachtenzestig miljoen tweehonderddrieëntwintigduizendhonderdzevenenzestigste")+  , (31940434634990099905, "eenendertig triljoen negenhonderdveertig biljard vierhonderdvierendertig biljoen zeshonderdvierendertig miljard negenhonderdnegentig miljoen negenennegentigduizendnegenhonderdvijfde")+  , (51680708854858323072, "eenenvijftig triljoen zeshonderdtachtig biljard zevenhonderdacht biljoen achthonderdvierenvijftig miljard achthonderdachtenvijftig miljoen driehonderddrieëntwintigduizendtweeënzeventigste")+  , (83621143489848422977, "drieëntachtig triljoen zeshonderdeenentwintig biljard honderddrieënveertig biljoen vierhonderdnegenentachtig miljard achthonderdachtenveertig miljoen vierhonderdtweeëntwintigduizendnegenhonderdzevenenzeventigste")+  , (135301852344706746049, "honderdvijfendertig triljoen driehonderdéén biljard achthonderdtweeënvijftig biljoen driehonderdvierenveertig miljard zevenhonderdzes miljoen zevenhonderdzesenveertigduizendnegenenveertigste")+  , (218922995834555169026, "tweehonderdachttien triljoen negenhonderdtweeëntwintig biljard negenhonderdvijfennegentig biljoen achthonderdvierendertig miljard vijfhonderdvijfenvijftig miljoen honderdnegenenzestigduizendzesentwintigste")+  , (354224848179261915075, "driehonderdvierenvijftig triljoen tweehonderdvierentwintig biljard achthonderdachtenveertig biljoen honderdnegenenzeventig miljard tweehonderdeenenzestig miljoen negenhonderdvijftienduizendvijfenzeventigste")+  , (573147844013817084101, "vijfhonderddrieënzeventig triljoen honderdzevenenveertig biljard achthonderdvierenveertig biljoen dertien miljard achthonderdzeventien miljoen vierentachtigduizendhonderdeerste")+  , (927372692193078999176, "negenhonderdzevenentwintig triljoen driehonderdtweeënzeventig biljard zeshonderdtweeënnegentig biljoen honderddrieënnegentig miljard achtenzeventig miljoen negenhonderdnegenennegentigduizendhonderdzesenzeventigste")+  , (1500520536206896083277, "een triljard vijfhonderd triljoen vijfhonderdtwintig biljard vijfhonderdzesendertig biljoen tweehonderdzes miljard achthonderdzesennegentig miljoen drieëntachtigduizendtweehonderdzevenenzeventigste")+  , (2427893228399975082453, "twee triljard vierhonderdzevenentwintig triljoen achthonderddrieënnegentig biljard tweehonderdachtentwintig biljoen driehonderdnegenennegentig miljard negenhonderdvijfenzeventig miljoen tweeëntachtigduizendvierhonderddrieënvijftigste")+  , (3928413764606871165730, "drie triljard negenhonderdachtentwintig triljoen vierhonderddertien biljard zevenhonderdvierenzestig biljoen zeshonderdzes miljard achthonderdeenenzeventig miljoen honderdvijfenzestigduizendzevenhonderddertigste")+  , (6356306993006846248183, "zes triljard driehonderdzesenvijftig triljoen driehonderdzes biljard negenhonderddrieënnegentig biljoen zes miljard achthonderdzesenveertig miljoen tweehonderdachtenveertigduizendhonderddrieëntachtigste")+  , (10284720757613717413913, "tien triljard tweehonderdvierentachtig triljoen zevenhonderdtwintig biljard zevenhonderdzevenenvijftig biljoen zeshonderddertien miljard zevenhonderdzeventien miljoen vierhonderddertienduizendnegenhonderddertiende")+  , (16641027750620563662096, "zestien triljard zeshonderdeenenveertig triljoen zevenentwintig biljard zevenhonderdvijftig biljoen zeshonderdtwintig miljard vijfhonderddrieënzestig miljoen zeshonderdtweeënzestigduizendzesennegentigste")+  , (26925748508234281076009, "zesentwintig triljard negenhonderdvijfentwintig triljoen zevenhonderdachtenveertig biljard vijfhonderdacht biljoen tweehonderdvierendertig miljard tweehonderdeenentachtig miljoen zesenzeventigduizendnegende")+  , (43566776258854844738105, "drieënveertig triljard vijfhonderdzesenzestig triljoen zevenhonderdzesenzeventig biljard tweehonderdachtenvijftig biljoen achthonderdvierenvijftig miljard achthonderdvierenveertig miljoen zevenhonderdachtendertigduizendhonderdvijfde")+  , (70492524767089125814114, "zeventig triljard vierhonderdtweeënnegentig triljoen vijfhonderdvierentwintig biljard zevenhonderdzevenenzestig biljoen negenentachtig miljard honderdvijfentwintig miljoen achthonderdveertienduizendhonderdveertiende")+  , (114059301025943970552219, "honderdveertien triljard negenenvijftig triljoen driehonderdéén biljard vijfentwintig biljoen negenhonderddrieënveertig miljard negenhonderdzeventig miljoen vijfhonderdtweeënvijftigduizendtweehonderdnegentiende")+  ]
+ test/Text/Numerals/Languages/EnglishSpec.hs view
@@ -0,0 +1,622 @@+module Text.Numerals.Languages.EnglishSpec (+    spec+  ) where++import Data.Text(Text)++import Test.Hspec(Spec)+import Text.Numerals.Languages.English(english)+import Text.Numerals.LanguageTest(testLanguage)++spec :: Spec+spec = testLanguage "English" english cardinals ordinals++cardinals :: [(Integer, Text)]+cardinals = [+    (0, "zero")+  , (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")+  , (20, "twenty")+  , (21, "twenty-one")+  , (22, "twenty-two")+  , (23, "twenty-three")+  , (24, "twenty-four")+  , (25, "twenty-five")+  , (26, "twenty-six")+  , (27, "twenty-seven")+  , (28, "twenty-eight")+  , (29, "twenty-nine")+  , (30, "thirty")+  , (31, "thirty-one")+  , (32, "thirty-two")+  , (33, "thirty-three")+  , (34, "thirty-four")+  , (35, "thirty-five")+  , (36, "thirty-six")+  , (37, "thirty-seven")+  , (38, "thirty-eight")+  , (39, "thirty-nine")+  , (40, "forty")+  , (41, "forty-one")+  , (42, "forty-two")+  , (43, "forty-three")+  , (44, "forty-four")+  , (45, "forty-five")+  , (46, "forty-six")+  , (47, "forty-seven")+  , (48, "forty-eight")+  , (49, "forty-nine")+  , (50, "fifty")+  , (51, "fifty-one")+  , (52, "fifty-two")+  , (53, "fifty-three")+  , (54, "fifty-four")+  , (55, "fifty-five")+  , (56, "fifty-six")+  , (57, "fifty-seven")+  , (58, "fifty-eight")+  , (59, "fifty-nine")+  , (60, "sixty")+  , (61, "sixty-one")+  , (62, "sixty-two")+  , (63, "sixty-three")+  , (64, "sixty-four")+  , (65, "sixty-five")+  , (66, "sixty-six")+  , (67, "sixty-seven")+  , (68, "sixty-eight")+  , (69, "sixty-nine")+  , (70, "seventy")+  , (71, "seventy-one")+  , (72, "seventy-two")+  , (73, "seventy-three")+  , (74, "seventy-four")+  , (75, "seventy-five")+  , (76, "seventy-six")+  , (77, "seventy-seven")+  , (78, "seventy-eight")+  , (79, "seventy-nine")+  , (80, "eighty")+  , (81, "eighty-one")+  , (82, "eighty-two")+  , (83, "eighty-three")+  , (84, "eighty-four")+  , (85, "eighty-five")+  , (86, "eighty-six")+  , (87, "eighty-seven")+  , (88, "eighty-eight")+  , (89, "eighty-nine")+  , (90, "ninety")+  , (91, "ninety-one")+  , (92, "ninety-two")+  , (93, "ninety-three")+  , (94, "ninety-four")+  , (95, "ninety-five")+  , (96, "ninety-six")+  , (97, "ninety-seven")+  , (98, "ninety-eight")+  , (99, "ninety-nine")+  , (100, "one hundred")+  , (101, "one hundred and one")+  , (102, "one hundred and two")+  , (103, "one hundred and three")+  , (104, "one hundred and four")+  , (105, "one hundred and five")+  , (106, "one hundred and six")+  , (107, "one hundred and seven")+  , (108, "one hundred and eight")+  , (109, "one hundred and nine")+  , (110, "one hundred and ten")+  , (111, "one hundred and eleven")+  , (112, "one hundred and twelve")+  , (113, "one hundred and thirteen")+  , (114, "one hundred and fourteen")+  , (115, "one hundred and fifteen")+  , (116, "one hundred and sixteen")+  , (117, "one hundred and seventeen")+  , (118, "one hundred and eighteen")+  , (119, "one hundred and nineteen")+  , (120, "one hundred and twenty")+  , (121, "one hundred and twenty-one")+  , (122, "one hundred and twenty-two")+  , (123, "one hundred and twenty-three")+  , (124, "one hundred and twenty-four")+  , (125, "one hundred and twenty-five")+  , (126, "one hundred and twenty-six")+  , (127, "one hundred and twenty-seven")+  , (128, "one hundred and twenty-eight")+  , (129, "one hundred and twenty-nine")+  , (130, "one hundred and thirty")+  , (131, "one hundred and thirty-one")+  , (132, "one hundred and thirty-two")+  , (133, "one hundred and thirty-three")+  , (134, "one hundred and thirty-four")+  , (135, "one hundred and thirty-five")+  , (136, "one hundred and thirty-six")+  , (137, "one hundred and thirty-seven")+  , (138, "one hundred and thirty-eight")+  , (139, "one hundred and thirty-nine")+  , (140, "one hundred and forty")+  , (141, "one hundred and forty-one")+  , (142, "one hundred and forty-two")+  , (143, "one hundred and forty-three")+  , (144, "one hundred and forty-four")+  , (145, "one hundred and forty-five")+  , (146, "one hundred and forty-six")+  , (147, "one hundred and forty-seven")+  , (148, "one hundred and forty-eight")+  , (149, "one hundred and forty-nine")+  , (150, "one hundred and fifty")+  , (151, "one hundred and fifty-one")+  , (152, "one hundred and fifty-two")+  , (153, "one hundred and fifty-three")+  , (154, "one hundred and fifty-four")+  , (155, "one hundred and fifty-five")+  , (156, "one hundred and fifty-six")+  , (157, "one hundred and fifty-seven")+  , (158, "one hundred and fifty-eight")+  , (159, "one hundred and fifty-nine")+  , (160, "one hundred and sixty")+  , (161, "one hundred and sixty-one")+  , (162, "one hundred and sixty-two")+  , (163, "one hundred and sixty-three")+  , (164, "one hundred and sixty-four")+  , (165, "one hundred and sixty-five")+  , (166, "one hundred and sixty-six")+  , (167, "one hundred and sixty-seven")+  , (168, "one hundred and sixty-eight")+  , (169, "one hundred and sixty-nine")+  , (170, "one hundred and seventy")+  , (171, "one hundred and seventy-one")+  , (172, "one hundred and seventy-two")+  , (173, "one hundred and seventy-three")+  , (174, "one hundred and seventy-four")+  , (175, "one hundred and seventy-five")+  , (176, "one hundred and seventy-six")+  , (177, "one hundred and seventy-seven")+  , (178, "one hundred and seventy-eight")+  , (179, "one hundred and seventy-nine")+  , (180, "one hundred and eighty")+  , (181, "one hundred and eighty-one")+  , (182, "one hundred and eighty-two")+  , (183, "one hundred and eighty-three")+  , (184, "one hundred and eighty-four")+  , (185, "one hundred and eighty-five")+  , (186, "one hundred and eighty-six")+  , (187, "one hundred and eighty-seven")+  , (188, "one hundred and eighty-eight")+  , (189, "one hundred and eighty-nine")+  , (190, "one hundred and ninety")+  , (191, "one hundred and ninety-one")+  , (192, "one hundred and ninety-two")+  , (193, "one hundred and ninety-three")+  , (194, "one hundred and ninety-four")+  , (195, "one hundred and ninety-five")+  , (196, "one hundred and ninety-six")+  , (197, "one hundred and ninety-seven")+  , (198, "one hundred and ninety-eight")+  , (199, "one hundred and ninety-nine")+  , (200, "two hundred")+  , (233, "two hundred and thirty-three")+  , (377, "three hundred and seventy-seven")+  , (610, "six hundred and ten")+  , (987, "nine hundred and eighty-seven")+  , (1597, "one thousand, five hundred and ninety-seven")+  , (2584, "two thousand, five hundred and eighty-four")+  , (4181, "four thousand, one hundred and eighty-one")+  , (6765, "six thousand, seven hundred and sixty-five")+  , (10946, "ten thousand, nine hundred and forty-six")+  , (17711, "seventeen thousand, seven hundred and eleven")+  , (28657, "twenty-eight thousand, six hundred and fifty-seven")+  , (46368, "forty-six thousand, three hundred and sixty-eight")+  , (75025, "seventy-five thousand and twenty-five")+  , (121393, "one hundred and twenty-one thousand, three hundred and ninety-three")+  , (196418, "one hundred and ninety-six thousand, four hundred and eighteen")+  , (317811, "three hundred and seventeen thousand, eight hundred and eleven")+  , (514229, "five hundred and fourteen thousand, two hundred and twenty-nine")+  , (832040, "eight hundred and thirty-two thousand and forty")+  , (1346269, "one million, three hundred and forty-six thousand, two hundred and sixty-nine")+  , (2178309, "two million, one hundred and seventy-eight thousand, three hundred and nine")+  , (3524578, "three million, five hundred and twenty-four thousand, five hundred and seventy-eight")+  , (5702887, "five million, seven hundred and two thousand, eight hundred and eighty-seven")+  , (9227465, "nine million, two hundred and twenty-seven thousand, four hundred and sixty-five")+  , (14930352, "fourteen million, nine hundred and thirty thousand, three hundred and fifty-two")+  , (24157817, "twenty-four million, one hundred and fifty-seven thousand, eight hundred and seventeen")+  , (39088169, "thirty-nine million, eighty-eight thousand, one hundred and sixty-nine")+  , (63245986, "sixty-three million, two hundred and forty-five thousand, nine hundred and eighty-six")+  , (102334155, "one hundred and two million, three hundred and thirty-four thousand, one hundred and fifty-five")+  , (165580141, "one hundred and sixty-five million, five hundred and eighty thousand, one hundred and forty-one")+  , (267914296, "two hundred and sixty-seven million, nine hundred and fourteen thousand, two hundred and ninety-six")+  , (433494437, "four hundred and thirty-three million, four hundred and ninety-four thousand, four hundred and thirty-seven")+  , (701408733, "seven hundred and one million, four hundred and eight thousand, seven hundred and thirty-three")+  , (1134903170, "one billion, one hundred and thirty-four million, nine hundred and three thousand, one hundred and seventy")+  , (1836311903, "one billion, eight hundred and thirty-six million, three hundred and eleven thousand, nine hundred and three")+  , (2971215073, "two billion, nine hundred and seventy-one million, two hundred and fifteen thousand and seventy-three")+  , (4807526976, "four billion, eight hundred and seven million, five hundred and twenty-six thousand, nine hundred and seventy-six")+  , (7778742049, "seven billion, seven hundred and seventy-eight million, seven hundred and forty-two thousand and forty-nine")+  , (12586269025, "twelve billion, five hundred and eighty-six million, two hundred and sixty-nine thousand and twenty-five")+  , (20365011074, "twenty billion, three hundred and sixty-five million, eleven thousand and seventy-four")+  , (32951280099, "thirty-two billion, nine hundred and fifty-one million, two hundred and eighty thousand and ninety-nine")+  , (53316291173, "fifty-three billion, three hundred and sixteen million, two hundred and ninety-one thousand, one hundred and seventy-three")+  , (86267571272, "eighty-six billion, two hundred and sixty-seven million, five hundred and seventy-one thousand, two hundred and seventy-two")+  , (139583862445, "one hundred and thirty-nine billion, five hundred and eighty-three million, eight hundred and sixty-two thousand, four hundred and forty-five")+  , (225851433717, "two hundred and twenty-five billion, eight hundred and fifty-one million, four hundred and thirty-three thousand, seven hundred and seventeen")+  , (365435296162, "three hundred and sixty-five billion, four hundred and thirty-five million, two hundred and ninety-six thousand, one hundred and sixty-two")+  , (591286729879, "five hundred and ninety-one billion, two hundred and eighty-six million, seven hundred and twenty-nine thousand, eight hundred and seventy-nine")+  , (956722026041, "nine hundred and fifty-six billion, seven hundred and twenty-two million, twenty-six thousand and forty-one")+  , (1548008755920, "one trillion, five hundred and forty-eight billion, eight million, seven hundred and fifty-five thousand, nine hundred and twenty")+  , (2504730781961, "two trillion, five hundred and four billion, seven hundred and thirty million, seven hundred and eighty-one thousand, nine hundred and sixty-one")+  , (4052739537881, "four trillion, fifty-two billion, seven hundred and thirty-nine million, five hundred and thirty-seven thousand, eight hundred and eighty-one")+  , (6557470319842, "six trillion, five hundred and fifty-seven billion, four hundred and seventy million, three hundred and nineteen thousand, eight hundred and forty-two")+  , (10610209857723, "ten trillion, six hundred and ten billion, two hundred and nine million, eight hundred and fifty-seven thousand, seven hundred and twenty-three")+  , (17167680177565, "seventeen trillion, one hundred and sixty-seven billion, six hundred and eighty million, one hundred and seventy-seven thousand, five hundred and sixty-five")+  , (27777890035288, "twenty-seven trillion, seven hundred and seventy-seven billion, eight hundred and ninety million, thirty-five thousand, two hundred and eighty-eight")+  , (44945570212853, "forty-four trillion, nine hundred and forty-five billion, five hundred and seventy million, two hundred and twelve thousand, eight hundred and fifty-three")+  , (72723460248141, "seventy-two trillion, seven hundred and twenty-three billion, four hundred and sixty million, two hundred and forty-eight thousand, one hundred and forty-one")+  , (117669030460994, "one hundred and seventeen trillion, six hundred and sixty-nine billion, thirty million, four hundred and sixty thousand, nine hundred and ninety-four")+  , (190392490709135, "one hundred and ninety trillion, three hundred and ninety-two billion, four hundred and ninety million, seven hundred and nine thousand, one hundred and thirty-five")+  , (308061521170129, "three hundred and eight trillion, sixty-one billion, five hundred and twenty-one million, one hundred and seventy thousand, one hundred and twenty-nine")+  , (498454011879264, "four hundred and ninety-eight trillion, four hundred and fifty-four billion, eleven million, eight hundred and seventy-nine thousand, two hundred and sixty-four")+  , (806515533049393, "eight hundred and six trillion, five hundred and fifteen billion, five hundred and thirty-three million, forty-nine thousand, three hundred and ninety-three")+  , (1304969544928657, "one quadrillion, three hundred and four trillion, nine hundred and sixty-nine billion, five hundred and forty-four million, nine hundred and twenty-eight thousand, six hundred and fifty-seven")+  , (2111485077978050, "two quadrillion, one hundred and eleven trillion, four hundred and eighty-five billion, seventy-seven million, nine hundred and seventy-eight thousand and fifty")+  , (3416454622906707, "three quadrillion, four hundred and sixteen trillion, four hundred and fifty-four billion, six hundred and twenty-two million, nine hundred and six thousand, seven hundred and seven")+  , (5527939700884757, "five quadrillion, five hundred and twenty-seven trillion, nine hundred and thirty-nine billion, seven hundred million, eight hundred and eighty-four thousand, seven hundred and fifty-seven")+  , (8944394323791464, "eight quadrillion, nine hundred and forty-four trillion, three hundred and ninety-four billion, three hundred and twenty-three million, seven hundred and ninety-one thousand, four hundred and sixty-four")+  , (14472334024676221, "fourteen quadrillion, four hundred and seventy-two trillion, three hundred and thirty-four billion, twenty-four million, six hundred and seventy-six thousand, two hundred and twenty-one")+  , (23416728348467685, "twenty-three quadrillion, four hundred and sixteen trillion, seven hundred and twenty-eight billion, three hundred and forty-eight million, four hundred and sixty-seven thousand, six hundred and eighty-five")+  , (37889062373143906, "thirty-seven quadrillion, eight hundred and eighty-nine trillion, sixty-two billion, three hundred and seventy-three million, one hundred and forty-three thousand, nine hundred and six")+  , (61305790721611591, "sixty-one quadrillion, three hundred and five trillion, seven hundred and ninety billion, seven hundred and twenty-one million, six hundred and eleven thousand, five hundred and ninety-one")+  , (99194853094755497, "ninety-nine quadrillion, one hundred and ninety-four trillion, eight hundred and fifty-three billion, ninety-four million, seven hundred and fifty-five thousand, four hundred and ninety-seven")+  , (160500643816367088, "one hundred and sixty quadrillion, five hundred trillion, six hundred and forty-three billion, eight hundred and sixteen million, three hundred and sixty-seven thousand and eighty-eight")+  , (259695496911122585, "two hundred and fifty-nine quadrillion, six hundred and ninety-five trillion, four hundred and ninety-six billion, nine hundred and eleven million, one hundred and twenty-two thousand, five hundred and eighty-five")+  , (420196140727489673, "four hundred and twenty quadrillion, one hundred and ninety-six trillion, one hundred and forty billion, seven hundred and twenty-seven million, four hundred and eighty-nine thousand, six hundred and seventy-three")+  , (679891637638612258, "six hundred and seventy-nine quadrillion, eight hundred and ninety-one trillion, six hundred and thirty-seven billion, six hundred and thirty-eight million, six hundred and twelve thousand, two hundred and fifty-eight")+  , (1100087778366101931, "one quintillion, one hundred quadrillion, eighty-seven trillion, seven hundred and seventy-eight billion, three hundred and sixty-six million, one hundred and one thousand, nine hundred and thirty-one")+  , (1779979416004714189, "one quintillion, seven hundred and seventy-nine quadrillion, nine hundred and seventy-nine trillion, four hundred and sixteen billion, four million, seven hundred and fourteen thousand, one hundred and eighty-nine")+  , (2880067194370816120, "two quintillion, eight hundred and eighty quadrillion, sixty-seven trillion, one hundred and ninety-four billion, three hundred and seventy million, eight hundred and sixteen thousand, one hundred and twenty")+  , (4660046610375530309, "four quintillion, six hundred and sixty quadrillion, forty-six trillion, six hundred and ten billion, three hundred and seventy-five million, five hundred and thirty thousand, three hundred and nine")+  , (7540113804746346429, "seven quintillion, five hundred and forty quadrillion, one hundred and thirteen trillion, eight hundred and four billion, seven hundred and forty-six million, three hundred and forty-six thousand, four hundred and twenty-nine")+  , (12200160415121876738, "twelve quintillion, two hundred quadrillion, one hundred and sixty trillion, four hundred and fifteen billion, one hundred and twenty-one million, eight hundred and seventy-six thousand, seven hundred and thirty-eight")+  , (19740274219868223167, "nineteen quintillion, seven hundred and forty quadrillion, two hundred and seventy-four trillion, two hundred and nineteen billion, eight hundred and sixty-eight million, two hundred and twenty-three thousand, one hundred and sixty-seven")+  , (31940434634990099905, "thirty-one quintillion, nine hundred and forty quadrillion, four hundred and thirty-four trillion, six hundred and thirty-four billion, nine hundred and ninety million, ninety-nine thousand, nine hundred and five")+  , (51680708854858323072, "fifty-one quintillion, six hundred and eighty quadrillion, seven hundred and eight trillion, eight hundred and fifty-four billion, eight hundred and fifty-eight million, three hundred and twenty-three thousand and seventy-two")+  , (83621143489848422977, "eighty-three quintillion, six hundred and twenty-one quadrillion, one hundred and forty-three trillion, four hundred and eighty-nine billion, eight hundred and forty-eight million, four hundred and twenty-two thousand, nine hundred and seventy-seven")+  , (135301852344706746049, "one hundred and thirty-five quintillion, three hundred and one quadrillion, eight hundred and fifty-two trillion, three hundred and forty-four billion, seven hundred and six million, seven hundred and forty-six thousand and forty-nine")+  , (218922995834555169026, "two hundred and eighteen quintillion, nine hundred and twenty-two quadrillion, nine hundred and ninety-five trillion, eight hundred and thirty-four billion, five hundred and fifty-five million, one hundred and sixty-nine thousand and twenty-six")+  , (354224848179261915075, "three hundred and fifty-four quintillion, two hundred and twenty-four quadrillion, eight hundred and forty-eight trillion, one hundred and seventy-nine billion, two hundred and sixty-one million, nine hundred and fifteen thousand and seventy-five")+  , (573147844013817084101, "five hundred and seventy-three quintillion, one hundred and forty-seven quadrillion, eight hundred and forty-four trillion, thirteen billion, eight hundred and seventeen million, eighty-four thousand, one hundred and one")+  , (927372692193078999176, "nine hundred and twenty-seven quintillion, three hundred and seventy-two quadrillion, six hundred and ninety-two trillion, one hundred and ninety-three billion, seventy-eight million, nine hundred and ninety-nine thousand, one hundred and seventy-six")+  , (1500520536206896083277, "one sextillion, five hundred quintillion, five hundred and twenty quadrillion, five hundred and thirty-six trillion, two hundred and six billion, eight hundred and ninety-six million, eighty-three thousand, two hundred and seventy-seven")+  , (2427893228399975082453, "two sextillion, four hundred and twenty-seven quintillion, eight hundred and ninety-three quadrillion, two hundred and twenty-eight trillion, three hundred and ninety-nine billion, nine hundred and seventy-five million, eighty-two thousand, four hundred and fifty-three")+  , (3928413764606871165730, "three sextillion, nine hundred and twenty-eight quintillion, four hundred and thirteen quadrillion, seven hundred and sixty-four trillion, six hundred and six billion, eight hundred and seventy-one million, one hundred and sixty-five thousand, seven hundred and thirty")+  , (6356306993006846248183, "six sextillion, three hundred and fifty-six quintillion, three hundred and six quadrillion, nine hundred and ninety-three trillion, six billion, eight hundred and forty-six million, two hundred and forty-eight thousand, one hundred and eighty-three")+  , (10284720757613717413913, "ten sextillion, two hundred and eighty-four quintillion, seven hundred and twenty quadrillion, seven hundred and fifty-seven trillion, six hundred and thirteen billion, seven hundred and seventeen million, four hundred and thirteen thousand, nine hundred and thirteen")+  , (16641027750620563662096, "sixteen sextillion, six hundred and forty-one quintillion, twenty-seven quadrillion, seven hundred and fifty trillion, six hundred and twenty billion, five hundred and sixty-three million, six hundred and sixty-two thousand and ninety-six")+  , (26925748508234281076009, "twenty-six sextillion, nine hundred and twenty-five quintillion, seven hundred and forty-eight quadrillion, five hundred and eight trillion, two hundred and thirty-four billion, two hundred and eighty-one million, seventy-six thousand and nine")+  , (43566776258854844738105, "forty-three sextillion, five hundred and sixty-six quintillion, seven hundred and seventy-six quadrillion, two hundred and fifty-eight trillion, eight hundred and fifty-four billion, eight hundred and forty-four million, seven hundred and thirty-eight thousand, one hundred and five")+  , (70492524767089125814114, "seventy sextillion, four hundred and ninety-two quintillion, five hundred and twenty-four quadrillion, seven hundred and sixty-seven trillion, eighty-nine billion, one hundred and twenty-five million, eight hundred and fourteen thousand, one hundred and fourteen")+  , (114059301025943970552219, "one hundred and fourteen sextillion, fifty-nine quintillion, three hundred and one quadrillion, twenty-five trillion, nine hundred and forty-three billion, nine hundred and seventy million, five hundred and fifty-two thousand, two hundred and nineteen")+  ]++ordinals :: [(Integer, Text)]+ordinals = [+    (0, "zeroth")+  , (1, "first")+  , (2, "second")+  , (3, "third")+  , (4, "fourth")+  , (5, "fifth")+  , (6, "sixth")+  , (7, "seventh")+  , (8, "eighth")+  , (9, "ninth")+  , (10, "tenth")+  , (11, "eleventh")+  , (12, "twelfth")+  , (13, "thirteenth")+  , (14, "fourteenth")+  , (15, "fifteenth")+  , (16, "sixteenth")+  , (17, "seventeenth")+  , (18, "eighteenth")+  , (19, "nineteenth")+  , (20, "twentieth")+  , (21, "twenty-first")+  , (22, "twenty-second")+  , (23, "twenty-third")+  , (24, "twenty-fourth")+  , (25, "twenty-fifth")+  , (26, "twenty-sixth")+  , (27, "twenty-seventh")+  , (28, "twenty-eighth")+  , (29, "twenty-ninth")+  , (30, "thirtieth")+  , (31, "thirty-first")+  , (32, "thirty-second")+  , (33, "thirty-third")+  , (34, "thirty-fourth")+  , (35, "thirty-fifth")+  , (36, "thirty-sixth")+  , (37, "thirty-seventh")+  , (38, "thirty-eighth")+  , (39, "thirty-ninth")+  , (40, "fortieth")+  , (41, "forty-first")+  , (42, "forty-second")+  , (43, "forty-third")+  , (44, "forty-fourth")+  , (45, "forty-fifth")+  , (46, "forty-sixth")+  , (47, "forty-seventh")+  , (48, "forty-eighth")+  , (49, "forty-ninth")+  , (50, "fiftieth")+  , (51, "fifty-first")+  , (52, "fifty-second")+  , (53, "fifty-third")+  , (54, "fifty-fourth")+  , (55, "fifty-fifth")+  , (56, "fifty-sixth")+  , (57, "fifty-seventh")+  , (58, "fifty-eighth")+  , (59, "fifty-ninth")+  , (60, "sixtieth")+  , (61, "sixty-first")+  , (62, "sixty-second")+  , (63, "sixty-third")+  , (64, "sixty-fourth")+  , (65, "sixty-fifth")+  , (66, "sixty-sixth")+  , (67, "sixty-seventh")+  , (68, "sixty-eighth")+  , (69, "sixty-ninth")+  , (70, "seventieth")+  , (71, "seventy-first")+  , (72, "seventy-second")+  , (73, "seventy-third")+  , (74, "seventy-fourth")+  , (75, "seventy-fifth")+  , (76, "seventy-sixth")+  , (77, "seventy-seventh")+  , (78, "seventy-eighth")+  , (79, "seventy-ninth")+  , (80, "eightieth")+  , (81, "eighty-first")+  , (82, "eighty-second")+  , (83, "eighty-third")+  , (84, "eighty-fourth")+  , (85, "eighty-fifth")+  , (86, "eighty-sixth")+  , (87, "eighty-seventh")+  , (88, "eighty-eighth")+  , (89, "eighty-ninth")+  , (90, "ninetieth")+  , (91, "ninety-first")+  , (92, "ninety-second")+  , (93, "ninety-third")+  , (94, "ninety-fourth")+  , (95, "ninety-fifth")+  , (96, "ninety-sixth")+  , (97, "ninety-seventh")+  , (98, "ninety-eighth")+  , (99, "ninety-ninth")+  , (100, "one hundredth")+  , (101, "one hundred and first")+  , (102, "one hundred and second")+  , (103, "one hundred and third")+  , (104, "one hundred and fourth")+  , (105, "one hundred and fifth")+  , (106, "one hundred and sixth")+  , (107, "one hundred and seventh")+  , (108, "one hundred and eighth")+  , (109, "one hundred and ninth")+  , (110, "one hundred and tenth")+  , (111, "one hundred and eleventh")+  , (112, "one hundred and twelfth")+  , (113, "one hundred and thirteenth")+  , (114, "one hundred and fourteenth")+  , (115, "one hundred and fifteenth")+  , (116, "one hundred and sixteenth")+  , (117, "one hundred and seventeenth")+  , (118, "one hundred and eighteenth")+  , (119, "one hundred and nineteenth")+  , (120, "one hundred and twentieth")+  , (121, "one hundred and twenty-first")+  , (122, "one hundred and twenty-second")+  , (123, "one hundred and twenty-third")+  , (124, "one hundred and twenty-fourth")+  , (125, "one hundred and twenty-fifth")+  , (126, "one hundred and twenty-sixth")+  , (127, "one hundred and twenty-seventh")+  , (128, "one hundred and twenty-eighth")+  , (129, "one hundred and twenty-ninth")+  , (130, "one hundred and thirtieth")+  , (131, "one hundred and thirty-first")+  , (132, "one hundred and thirty-second")+  , (133, "one hundred and thirty-third")+  , (134, "one hundred and thirty-fourth")+  , (135, "one hundred and thirty-fifth")+  , (136, "one hundred and thirty-sixth")+  , (137, "one hundred and thirty-seventh")+  , (138, "one hundred and thirty-eighth")+  , (139, "one hundred and thirty-ninth")+  , (140, "one hundred and fortieth")+  , (141, "one hundred and forty-first")+  , (142, "one hundred and forty-second")+  , (143, "one hundred and forty-third")+  , (144, "one hundred and forty-fourth")+  , (145, "one hundred and forty-fifth")+  , (146, "one hundred and forty-sixth")+  , (147, "one hundred and forty-seventh")+  , (148, "one hundred and forty-eighth")+  , (149, "one hundred and forty-ninth")+  , (150, "one hundred and fiftieth")+  , (151, "one hundred and fifty-first")+  , (152, "one hundred and fifty-second")+  , (153, "one hundred and fifty-third")+  , (154, "one hundred and fifty-fourth")+  , (155, "one hundred and fifty-fifth")+  , (156, "one hundred and fifty-sixth")+  , (157, "one hundred and fifty-seventh")+  , (158, "one hundred and fifty-eighth")+  , (159, "one hundred and fifty-ninth")+  , (160, "one hundred and sixtieth")+  , (161, "one hundred and sixty-first")+  , (162, "one hundred and sixty-second")+  , (163, "one hundred and sixty-third")+  , (164, "one hundred and sixty-fourth")+  , (165, "one hundred and sixty-fifth")+  , (166, "one hundred and sixty-sixth")+  , (167, "one hundred and sixty-seventh")+  , (168, "one hundred and sixty-eighth")+  , (169, "one hundred and sixty-ninth")+  , (170, "one hundred and seventieth")+  , (171, "one hundred and seventy-first")+  , (172, "one hundred and seventy-second")+  , (173, "one hundred and seventy-third")+  , (174, "one hundred and seventy-fourth")+  , (175, "one hundred and seventy-fifth")+  , (176, "one hundred and seventy-sixth")+  , (177, "one hundred and seventy-seventh")+  , (178, "one hundred and seventy-eighth")+  , (179, "one hundred and seventy-ninth")+  , (180, "one hundred and eightieth")+  , (181, "one hundred and eighty-first")+  , (182, "one hundred and eighty-second")+  , (183, "one hundred and eighty-third")+  , (184, "one hundred and eighty-fourth")+  , (185, "one hundred and eighty-fifth")+  , (186, "one hundred and eighty-sixth")+  , (187, "one hundred and eighty-seventh")+  , (188, "one hundred and eighty-eighth")+  , (189, "one hundred and eighty-ninth")+  , (190, "one hundred and ninetieth")+  , (191, "one hundred and ninety-first")+  , (192, "one hundred and ninety-second")+  , (193, "one hundred and ninety-third")+  , (194, "one hundred and ninety-fourth")+  , (195, "one hundred and ninety-fifth")+  , (196, "one hundred and ninety-sixth")+  , (197, "one hundred and ninety-seventh")+  , (198, "one hundred and ninety-eighth")+  , (199, "one hundred and ninety-ninth")+  , (200, "two hundredth")+  , (233, "two hundred and thirty-third")+  , (377, "three hundred and seventy-seventh")+  , (610, "six hundred and tenth")+  , (987, "nine hundred and eighty-seventh")+  , (1597, "one thousand, five hundred and ninety-seventh")+  , (2584, "two thousand, five hundred and eighty-fourth")+  , (4181, "four thousand, one hundred and eighty-first")+  , (6765, "six thousand, seven hundred and sixty-fifth")+  , (10946, "ten thousand, nine hundred and forty-sixth")+  , (17711, "seventeen thousand, seven hundred and eleventh")+  , (28657, "twenty-eight thousand, six hundred and fifty-seventh")+  , (46368, "forty-six thousand, three hundred and sixty-eighth")+  , (75025, "seventy-five thousand and twenty-fifth")+  , (121393, "one hundred and twenty-one thousand, three hundred and ninety-third")+  , (196418, "one hundred and ninety-six thousand, four hundred and eighteenth")+  , (317811, "three hundred and seventeen thousand, eight hundred and eleventh")+  , (514229, "five hundred and fourteen thousand, two hundred and twenty-ninth")+  , (832040, "eight hundred and thirty-two thousand and fortieth")+  , (1346269, "one million, three hundred and forty-six thousand, two hundred and sixty-ninth")+  , (2178309, "two million, one hundred and seventy-eight thousand, three hundred and ninth")+  , (3524578, "three million, five hundred and twenty-four thousand, five hundred and seventy-eighth")+  , (5702887, "five million, seven hundred and two thousand, eight hundred and eighty-seventh")+  , (9227465, "nine million, two hundred and twenty-seven thousand, four hundred and sixty-fifth")+  , (14930352, "fourteen million, nine hundred and thirty thousand, three hundred and fifty-second")+  , (24157817, "twenty-four million, one hundred and fifty-seven thousand, eight hundred and seventeenth")+  , (39088169, "thirty-nine million, eighty-eight thousand, one hundred and sixty-ninth")+  , (63245986, "sixty-three million, two hundred and forty-five thousand, nine hundred and eighty-sixth")+  , (102334155, "one hundred and two million, three hundred and thirty-four thousand, one hundred and fifty-fifth")+  , (165580141, "one hundred and sixty-five million, five hundred and eighty thousand, one hundred and forty-first")+  , (267914296, "two hundred and sixty-seven million, nine hundred and fourteen thousand, two hundred and ninety-sixth")+  , (433494437, "four hundred and thirty-three million, four hundred and ninety-four thousand, four hundred and thirty-seventh")+  , (701408733, "seven hundred and one million, four hundred and eight thousand, seven hundred and thirty-third")+  , (1134903170, "one billion, one hundred and thirty-four million, nine hundred and three thousand, one hundred and seventieth")+  , (1836311903, "one billion, eight hundred and thirty-six million, three hundred and eleven thousand, nine hundred and third")+  , (2971215073, "two billion, nine hundred and seventy-one million, two hundred and fifteen thousand and seventy-third")+  , (4807526976, "four billion, eight hundred and seven million, five hundred and twenty-six thousand, nine hundred and seventy-sixth")+  , (7778742049, "seven billion, seven hundred and seventy-eight million, seven hundred and forty-two thousand and forty-ninth")+  , (12586269025, "twelve billion, five hundred and eighty-six million, two hundred and sixty-nine thousand and twenty-fifth")+  , (20365011074, "twenty billion, three hundred and sixty-five million, eleven thousand and seventy-fourth")+  , (32951280099, "thirty-two billion, nine hundred and fifty-one million, two hundred and eighty thousand and ninety-ninth")+  , (53316291173, "fifty-three billion, three hundred and sixteen million, two hundred and ninety-one thousand, one hundred and seventy-third")+  , (86267571272, "eighty-six billion, two hundred and sixty-seven million, five hundred and seventy-one thousand, two hundred and seventy-second")+  , (139583862445, "one hundred and thirty-nine billion, five hundred and eighty-three million, eight hundred and sixty-two thousand, four hundred and forty-fifth")+  , (225851433717, "two hundred and twenty-five billion, eight hundred and fifty-one million, four hundred and thirty-three thousand, seven hundred and seventeenth")+  , (365435296162, "three hundred and sixty-five billion, four hundred and thirty-five million, two hundred and ninety-six thousand, one hundred and sixty-second")+  , (591286729879, "five hundred and ninety-one billion, two hundred and eighty-six million, seven hundred and twenty-nine thousand, eight hundred and seventy-ninth")+  , (956722026041, "nine hundred and fifty-six billion, seven hundred and twenty-two million, twenty-six thousand and forty-first")+  , (1548008755920, "one trillion, five hundred and forty-eight billion, eight million, seven hundred and fifty-five thousand, nine hundred and twentieth")+  , (2504730781961, "two trillion, five hundred and four billion, seven hundred and thirty million, seven hundred and eighty-one thousand, nine hundred and sixty-first")+  , (4052739537881, "four trillion, fifty-two billion, seven hundred and thirty-nine million, five hundred and thirty-seven thousand, eight hundred and eighty-first")+  , (6557470319842, "six trillion, five hundred and fifty-seven billion, four hundred and seventy million, three hundred and nineteen thousand, eight hundred and forty-second")+  , (10610209857723, "ten trillion, six hundred and ten billion, two hundred and nine million, eight hundred and fifty-seven thousand, seven hundred and twenty-third")+  , (17167680177565, "seventeen trillion, one hundred and sixty-seven billion, six hundred and eighty million, one hundred and seventy-seven thousand, five hundred and sixty-fifth")+  , (27777890035288, "twenty-seven trillion, seven hundred and seventy-seven billion, eight hundred and ninety million, thirty-five thousand, two hundred and eighty-eighth")+  , (44945570212853, "forty-four trillion, nine hundred and forty-five billion, five hundred and seventy million, two hundred and twelve thousand, eight hundred and fifty-third")+  , (72723460248141, "seventy-two trillion, seven hundred and twenty-three billion, four hundred and sixty million, two hundred and forty-eight thousand, one hundred and forty-first")+  , (117669030460994, "one hundred and seventeen trillion, six hundred and sixty-nine billion, thirty million, four hundred and sixty thousand, nine hundred and ninety-fourth")+  , (190392490709135, "one hundred and ninety trillion, three hundred and ninety-two billion, four hundred and ninety million, seven hundred and nine thousand, one hundred and thirty-fifth")+  , (308061521170129, "three hundred and eight trillion, sixty-one billion, five hundred and twenty-one million, one hundred and seventy thousand, one hundred and twenty-ninth")+  , (498454011879264, "four hundred and ninety-eight trillion, four hundred and fifty-four billion, eleven million, eight hundred and seventy-nine thousand, two hundred and sixty-fourth")+  , (806515533049393, "eight hundred and six trillion, five hundred and fifteen billion, five hundred and thirty-three million, forty-nine thousand, three hundred and ninety-third")+  , (1304969544928657, "one quadrillion, three hundred and four trillion, nine hundred and sixty-nine billion, five hundred and forty-four million, nine hundred and twenty-eight thousand, six hundred and fifty-seventh")+  , (2111485077978050, "two quadrillion, one hundred and eleven trillion, four hundred and eighty-five billion, seventy-seven million, nine hundred and seventy-eight thousand and fiftieth")+  , (3416454622906707, "three quadrillion, four hundred and sixteen trillion, four hundred and fifty-four billion, six hundred and twenty-two million, nine hundred and six thousand, seven hundred and seventh")+  , (5527939700884757, "five quadrillion, five hundred and twenty-seven trillion, nine hundred and thirty-nine billion, seven hundred million, eight hundred and eighty-four thousand, seven hundred and fifty-seventh")+  , (8944394323791464, "eight quadrillion, nine hundred and forty-four trillion, three hundred and ninety-four billion, three hundred and twenty-three million, seven hundred and ninety-one thousand, four hundred and sixty-fourth")+  , (14472334024676221, "fourteen quadrillion, four hundred and seventy-two trillion, three hundred and thirty-four billion, twenty-four million, six hundred and seventy-six thousand, two hundred and twenty-first")+  , (23416728348467685, "twenty-three quadrillion, four hundred and sixteen trillion, seven hundred and twenty-eight billion, three hundred and forty-eight million, four hundred and sixty-seven thousand, six hundred and eighty-fifth")+  , (37889062373143906, "thirty-seven quadrillion, eight hundred and eighty-nine trillion, sixty-two billion, three hundred and seventy-three million, one hundred and forty-three thousand, nine hundred and sixth")+  , (61305790721611591, "sixty-one quadrillion, three hundred and five trillion, seven hundred and ninety billion, seven hundred and twenty-one million, six hundred and eleven thousand, five hundred and ninety-first")+  , (99194853094755497, "ninety-nine quadrillion, one hundred and ninety-four trillion, eight hundred and fifty-three billion, ninety-four million, seven hundred and fifty-five thousand, four hundred and ninety-seventh")+  , (160500643816367088, "one hundred and sixty quadrillion, five hundred trillion, six hundred and forty-three billion, eight hundred and sixteen million, three hundred and sixty-seven thousand and eighty-eighth")+  , (259695496911122585, "two hundred and fifty-nine quadrillion, six hundred and ninety-five trillion, four hundred and ninety-six billion, nine hundred and eleven million, one hundred and twenty-two thousand, five hundred and eighty-fifth")+  , (420196140727489673, "four hundred and twenty quadrillion, one hundred and ninety-six trillion, one hundred and forty billion, seven hundred and twenty-seven million, four hundred and eighty-nine thousand, six hundred and seventy-third")+  , (679891637638612258, "six hundred and seventy-nine quadrillion, eight hundred and ninety-one trillion, six hundred and thirty-seven billion, six hundred and thirty-eight million, six hundred and twelve thousand, two hundred and fifty-eighth")+  , (1100087778366101931, "one quintillion, one hundred quadrillion, eighty-seven trillion, seven hundred and seventy-eight billion, three hundred and sixty-six million, one hundred and one thousand, nine hundred and thirty-first")+  , (1779979416004714189, "one quintillion, seven hundred and seventy-nine quadrillion, nine hundred and seventy-nine trillion, four hundred and sixteen billion, four million, seven hundred and fourteen thousand, one hundred and eighty-ninth")+  , (2880067194370816120, "two quintillion, eight hundred and eighty quadrillion, sixty-seven trillion, one hundred and ninety-four billion, three hundred and seventy million, eight hundred and sixteen thousand, one hundred and twentieth")+  , (4660046610375530309, "four quintillion, six hundred and sixty quadrillion, forty-six trillion, six hundred and ten billion, three hundred and seventy-five million, five hundred and thirty thousand, three hundred and ninth")+  , (7540113804746346429, "seven quintillion, five hundred and forty quadrillion, one hundred and thirteen trillion, eight hundred and four billion, seven hundred and forty-six million, three hundred and forty-six thousand, four hundred and twenty-ninth")+  , (12200160415121876738, "twelve quintillion, two hundred quadrillion, one hundred and sixty trillion, four hundred and fifteen billion, one hundred and twenty-one million, eight hundred and seventy-six thousand, seven hundred and thirty-eighth")+  , (19740274219868223167, "nineteen quintillion, seven hundred and forty quadrillion, two hundred and seventy-four trillion, two hundred and nineteen billion, eight hundred and sixty-eight million, two hundred and twenty-three thousand, one hundred and sixty-seventh")+  , (31940434634990099905, "thirty-one quintillion, nine hundred and forty quadrillion, four hundred and thirty-four trillion, six hundred and thirty-four billion, nine hundred and ninety million, ninety-nine thousand, nine hundred and fifth")+  , (51680708854858323072, "fifty-one quintillion, six hundred and eighty quadrillion, seven hundred and eight trillion, eight hundred and fifty-four billion, eight hundred and fifty-eight million, three hundred and twenty-three thousand and seventy-second")+  , (83621143489848422977, "eighty-three quintillion, six hundred and twenty-one quadrillion, one hundred and forty-three trillion, four hundred and eighty-nine billion, eight hundred and forty-eight million, four hundred and twenty-two thousand, nine hundred and seventy-seventh")+  , (135301852344706746049, "one hundred and thirty-five quintillion, three hundred and one quadrillion, eight hundred and fifty-two trillion, three hundred and forty-four billion, seven hundred and six million, seven hundred and forty-six thousand and forty-ninth")+  , (218922995834555169026, "two hundred and eighteen quintillion, nine hundred and twenty-two quadrillion, nine hundred and ninety-five trillion, eight hundred and thirty-four billion, five hundred and fifty-five million, one hundred and sixty-nine thousand and twenty-sixth")+  , (354224848179261915075, "three hundred and fifty-four quintillion, two hundred and twenty-four quadrillion, eight hundred and forty-eight trillion, one hundred and seventy-nine billion, two hundred and sixty-one million, nine hundred and fifteen thousand and seventy-fifth")+  , (573147844013817084101, "five hundred and seventy-three quintillion, one hundred and forty-seven quadrillion, eight hundred and forty-four trillion, thirteen billion, eight hundred and seventeen million, eighty-four thousand, one hundred and first")+  , (927372692193078999176, "nine hundred and twenty-seven quintillion, three hundred and seventy-two quadrillion, six hundred and ninety-two trillion, one hundred and ninety-three billion, seventy-eight million, nine hundred and ninety-nine thousand, one hundred and seventy-sixth")+  , (1500520536206896083277, "one sextillion, five hundred quintillion, five hundred and twenty quadrillion, five hundred and thirty-six trillion, two hundred and six billion, eight hundred and ninety-six million, eighty-three thousand, two hundred and seventy-seventh")+  , (2427893228399975082453, "two sextillion, four hundred and twenty-seven quintillion, eight hundred and ninety-three quadrillion, two hundred and twenty-eight trillion, three hundred and ninety-nine billion, nine hundred and seventy-five million, eighty-two thousand, four hundred and fifty-third")+  , (3928413764606871165730, "three sextillion, nine hundred and twenty-eight quintillion, four hundred and thirteen quadrillion, seven hundred and sixty-four trillion, six hundred and six billion, eight hundred and seventy-one million, one hundred and sixty-five thousand, seven hundred and thirtieth")+  , (6356306993006846248183, "six sextillion, three hundred and fifty-six quintillion, three hundred and six quadrillion, nine hundred and ninety-three trillion, six billion, eight hundred and forty-six million, two hundred and forty-eight thousand, one hundred and eighty-third")+  , (10284720757613717413913, "ten sextillion, two hundred and eighty-four quintillion, seven hundred and twenty quadrillion, seven hundred and fifty-seven trillion, six hundred and thirteen billion, seven hundred and seventeen million, four hundred and thirteen thousand, nine hundred and thirteenth")+  , (16641027750620563662096, "sixteen sextillion, six hundred and forty-one quintillion, twenty-seven quadrillion, seven hundred and fifty trillion, six hundred and twenty billion, five hundred and sixty-three million, six hundred and sixty-two thousand and ninety-sixth")+  , (26925748508234281076009, "twenty-six sextillion, nine hundred and twenty-five quintillion, seven hundred and forty-eight quadrillion, five hundred and eight trillion, two hundred and thirty-four billion, two hundred and eighty-one million, seventy-six thousand and ninth")+  , (43566776258854844738105, "forty-three sextillion, five hundred and sixty-six quintillion, seven hundred and seventy-six quadrillion, two hundred and fifty-eight trillion, eight hundred and fifty-four billion, eight hundred and forty-four million, seven hundred and thirty-eight thousand, one hundred and fifth")+  , (70492524767089125814114, "seventy sextillion, four hundred and ninety-two quintillion, five hundred and twenty-four quadrillion, seven hundred and sixty-seven trillion, eighty-nine billion, one hundred and twenty-five million, eight hundred and fourteen thousand, one hundred and fourteenth")+  , (114059301025943970552219, "one hundred and fourteen sextillion, fifty-nine quintillion, three hundred and one quadrillion, twenty-five trillion, nine hundred and forty-three billion, nine hundred and seventy million, five hundred and fifty-two thousand, two hundred and nineteenth")+  ]
+ test/Text/Numerals/Languages/FrenchSpec.hs view
@@ -0,0 +1,622 @@+module Text.Numerals.Languages.FrenchSpec (+    spec+  ) where++import Data.Text(Text)++import Test.Hspec(Spec)+import Text.Numerals.Languages.French(french)+import Text.Numerals.LanguageTest(testLanguage)++spec :: Spec+spec = testLanguage "French" french cardinals ordinals++cardinals :: [(Integer, Text)]+cardinals = [+    (0, "zéro")+  , (1, "un")+  , (2, "deux")+  , (3, "trois")+  , (4, "quatre")+  , (5, "cinq")+  , (6, "six")+  , (7, "sept")+  , (8, "huit")+  , (9, "neuf")+  , (10, "dix")+  , (11, "onze")+  , (12, "douze")+  , (13, "treize")+  , (14, "quatorze")+  , (15, "quinze")+  , (16, "seize")+  , (17, "dix-sept")+  , (18, "dix-huit")+  , (19, "dix-neuf")+  , (20, "vingt")+  , (21, "vingt et un")+  , (22, "vingt-deux")+  , (23, "vingt-trois")+  , (24, "vingt-quatre")+  , (25, "vingt-cinq")+  , (26, "vingt-six")+  , (27, "vingt-sept")+  , (28, "vingt-huit")+  , (29, "vingt-neuf")+  , (30, "trente")+  , (31, "trente et un")+  , (32, "trente-deux")+  , (33, "trente-trois")+  , (34, "trente-quatre")+  , (35, "trente-cinq")+  , (36, "trente-six")+  , (37, "trente-sept")+  , (38, "trente-huit")+  , (39, "trente-neuf")+  , (40, "quarante")+  , (41, "quarante et un")+  , (42, "quarante-deux")+  , (43, "quarante-trois")+  , (44, "quarante-quatre")+  , (45, "quarante-cinq")+  , (46, "quarante-six")+  , (47, "quarante-sept")+  , (48, "quarante-huit")+  , (49, "quarante-neuf")+  , (50, "cinquante")+  , (51, "cinquante et un")+  , (52, "cinquante-deux")+  , (53, "cinquante-trois")+  , (54, "cinquante-quatre")+  , (55, "cinquante-cinq")+  , (56, "cinquante-six")+  , (57, "cinquante-sept")+  , (58, "cinquante-huit")+  , (59, "cinquante-neuf")+  , (60, "soixante")+  , (61, "soixante et un")+  , (62, "soixante-deux")+  , (63, "soixante-trois")+  , (64, "soixante-quatre")+  , (65, "soixante-cinq")+  , (66, "soixante-six")+  , (67, "soixante-sept")+  , (68, "soixante-huit")+  , (69, "soixante-neuf")+  , (70, "soixante-dix")+  , (71, "soixante et onze")+  , (72, "soixante-douze")+  , (73, "soixante-treize")+  , (74, "soixante-quatorze")+  , (75, "soixante-quinze")+  , (76, "soixante-seize")+  , (77, "soixante-dix-sept")+  , (78, "soixante-dix-huit")+  , (79, "soixante-dix-neuf")+  , (80, "quatre-vingts")+  , (81, "quatre-vingt-un")+  , (82, "quatre-vingt-deux")+  , (83, "quatre-vingt-trois")+  , (84, "quatre-vingt-quatre")+  , (85, "quatre-vingt-cinq")+  , (86, "quatre-vingt-six")+  , (87, "quatre-vingt-sept")+  , (88, "quatre-vingt-huit")+  , (89, "quatre-vingt-neuf")+  , (90, "quatre-vingt-dix")+  , (91, "quatre-vingt-onze")+  , (92, "quatre-vingt-douze")+  , (93, "quatre-vingt-treize")+  , (94, "quatre-vingt-quatorze")+  , (95, "quatre-vingt-quinze")+  , (96, "quatre-vingt-seize")+  , (97, "quatre-vingt-dix-sept")+  , (98, "quatre-vingt-dix-huit")+  , (99, "quatre-vingt-dix-neuf")+  , (100, "cent")+  , (101, "cent un")+  , (102, "cent deux")+  , (103, "cent trois")+  , (104, "cent quatre")+  , (105, "cent cinq")+  , (106, "cent six")+  , (107, "cent sept")+  , (108, "cent huit")+  , (109, "cent neuf")+  , (110, "cent dix")+  , (111, "cent onze")+  , (112, "cent douze")+  , (113, "cent treize")+  , (114, "cent quatorze")+  , (115, "cent quinze")+  , (116, "cent seize")+  , (117, "cent dix-sept")+  , (118, "cent dix-huit")+  , (119, "cent dix-neuf")+  , (120, "cent vingt")+  , (121, "cent vingt et un")+  , (122, "cent vingt-deux")+  , (123, "cent vingt-trois")+  , (124, "cent vingt-quatre")+  , (125, "cent vingt-cinq")+  , (126, "cent vingt-six")+  , (127, "cent vingt-sept")+  , (128, "cent vingt-huit")+  , (129, "cent vingt-neuf")+  , (130, "cent trente")+  , (131, "cent trente et un")+  , (132, "cent trente-deux")+  , (133, "cent trente-trois")+  , (134, "cent trente-quatre")+  , (135, "cent trente-cinq")+  , (136, "cent trente-six")+  , (137, "cent trente-sept")+  , (138, "cent trente-huit")+  , (139, "cent trente-neuf")+  , (140, "cent quarante")+  , (141, "cent quarante et un")+  , (142, "cent quarante-deux")+  , (143, "cent quarante-trois")+  , (144, "cent quarante-quatre")+  , (145, "cent quarante-cinq")+  , (146, "cent quarante-six")+  , (147, "cent quarante-sept")+  , (148, "cent quarante-huit")+  , (149, "cent quarante-neuf")+  , (150, "cent cinquante")+  , (151, "cent cinquante et un")+  , (152, "cent cinquante-deux")+  , (153, "cent cinquante-trois")+  , (154, "cent cinquante-quatre")+  , (155, "cent cinquante-cinq")+  , (156, "cent cinquante-six")+  , (157, "cent cinquante-sept")+  , (158, "cent cinquante-huit")+  , (159, "cent cinquante-neuf")+  , (160, "cent soixante")+  , (161, "cent soixante et un")+  , (162, "cent soixante-deux")+  , (163, "cent soixante-trois")+  , (164, "cent soixante-quatre")+  , (165, "cent soixante-cinq")+  , (166, "cent soixante-six")+  , (167, "cent soixante-sept")+  , (168, "cent soixante-huit")+  , (169, "cent soixante-neuf")+  , (170, "cent soixante-dix")+  , (171, "cent soixante et onze")+  , (172, "cent soixante-douze")+  , (173, "cent soixante-treize")+  , (174, "cent soixante-quatorze")+  , (175, "cent soixante-quinze")+  , (176, "cent soixante-seize")+  , (177, "cent soixante-dix-sept")+  , (178, "cent soixante-dix-huit")+  , (179, "cent soixante-dix-neuf")+  , (180, "cent quatre-vingts")+  , (181, "cent quatre-vingt-un")+  , (182, "cent quatre-vingt-deux")+  , (183, "cent quatre-vingt-trois")+  , (184, "cent quatre-vingt-quatre")+  , (185, "cent quatre-vingt-cinq")+  , (186, "cent quatre-vingt-six")+  , (187, "cent quatre-vingt-sept")+  , (188, "cent quatre-vingt-huit")+  , (189, "cent quatre-vingt-neuf")+  , (190, "cent quatre-vingt-dix")+  , (191, "cent quatre-vingt-onze")+  , (192, "cent quatre-vingt-douze")+  , (193, "cent quatre-vingt-treize")+  , (194, "cent quatre-vingt-quatorze")+  , (195, "cent quatre-vingt-quinze")+  , (196, "cent quatre-vingt-seize")+  , (197, "cent quatre-vingt-dix-sept")+  , (198, "cent quatre-vingt-dix-huit")+  , (199, "cent quatre-vingt-dix-neuf")+  , (200, "deux cents")+  , (233, "deux cent trente-trois")+  , (377, "trois cent soixante-dix-sept")+  , (610, "six cent dix")+  , (987, "neuf cent quatre-vingt-sept")+  , (1597, "mille cinq cent quatre-vingt-dix-sept")+  , (2584, "deux mille cinq cent quatre-vingt-quatre")+  , (4181, "quatre mille cent quatre-vingt-un")+  , (6765, "six mille sept cent soixante-cinq")+  , (10946, "dix mille neuf cent quarante-six")+  , (17711, "dix-sept mille sept cent onze")+  , (28657, "vingt-huit mille six cent cinquante-sept")+  , (46368, "quarante-six mille trois cent soixante-huit")+  , (75025, "soixante-quinze mille vingt-cinq")+  , (121393, "cent vingt et un mille trois cent quatre-vingt-treize")+  , (196418, "cent quatre-vingt-seize mille quatre cent dix-huit")+  , (317811, "trois cent dix-sept mille huit cent onze")+  , (514229, "cinq cent quatorze mille deux cent vingt-neuf")+  , (832040, "huit cent trente-deux mille quarante")+  , (1346269, "un million trois cent quarante-six mille deux cent soixante-neuf")+  , (2178309, "deux millions cent soixante-dix-huit mille trois cent neuf")+  , (3524578, "trois millions cinq cent vingt-quatre mille cinq cent soixante-dix-huit")+  , (5702887, "cinq millions sept cent deux mille huit cent quatre-vingt-sept")+  , (9227465, "neuf millions deux cent vingt-sept mille quatre cent soixante-cinq")+  , (14930352, "quatorze millions neuf cent trente mille trois cent cinquante-deux")+  , (24157817, "vingt-quatre millions cent cinquante-sept mille huit cent dix-sept")+  , (39088169, "trente-neuf millions quatre-vingt-huit mille cent soixante-neuf")+  , (63245986, "soixante-trois millions deux cent quarante-cinq mille neuf cent quatre-vingt-six")+  , (102334155, "cent deux millions trois cent trente-quatre mille cent cinquante-cinq")+  , (165580141, "cent soixante-cinq millions cinq cent quatre-vingt mille cent quarante et un")+  , (267914296, "deux cent soixante-sept millions neuf cent quatorze mille deux cent quatre-vingt-seize")+  , (433494437, "quatre cent trente-trois millions quatre cent quatre-vingt-quatorze mille quatre cent trente-sept")+  , (701408733, "sept cent un millions quatre cent huit mille sept cent trente-trois")+  , (1134903170, "un milliard cent trente-quatre millions neuf cent trois mille cent soixante-dix")+  , (1836311903, "un milliard huit cent trente-six millions trois cent onze mille neuf cent trois")+  , (2971215073, "deux milliards neuf cent soixante et onze millions deux cent quinze mille soixante-treize")+  , (4807526976, "quatre milliards huit cent sept millions cinq cent vingt-six mille neuf cent soixante-seize")+  , (7778742049, "sept milliards sept cent soixante-dix-huit millions sept cent quarante-deux mille quarante-neuf")+  , (12586269025, "douze milliards cinq cent quatre-vingt-six millions deux cent soixante-neuf mille vingt-cinq")+  , (20365011074, "vingt milliards trois cent soixante-cinq millions onze mille soixante-quatorze")+  , (32951280099, "trente-deux milliards neuf cent cinquante et un millions deux cent quatre-vingt mille quatre-vingt-dix-neuf")+  , (53316291173, "cinquante-trois milliards trois cent seize millions deux cent quatre-vingt-onze mille cent soixante-treize")+  , (86267571272, "quatre-vingt-six milliards deux cent soixante-sept millions cinq cent soixante et onze mille deux cent soixante-douze")+  , (139583862445, "cent trente-neuf milliards cinq cent quatre-vingt-trois millions huit cent soixante-deux mille quatre cent quarante-cinq")+  , (225851433717, "deux cent vingt-cinq milliards huit cent cinquante et un millions quatre cent trente-trois mille sept cent dix-sept")+  , (365435296162, "trois cent soixante-cinq milliards quatre cent trente-cinq millions deux cent quatre-vingt-seize mille cent soixante-deux")+  , (591286729879, "cinq cent quatre-vingt-onze milliards deux cent quatre-vingt-six millions sept cent vingt-neuf mille huit cent soixante-dix-neuf")+  , (956722026041, "neuf cent cinquante-six milliards sept cent vingt-deux millions vingt-six mille quarante et un")+  , (1548008755920, "un billion cinq cent quarante-huit milliards huit millions sept cent cinquante-cinq mille neuf cent vingt")+  , (2504730781961, "deux billions cinq cent quatre milliards sept cent trente millions sept cent quatre-vingt-un mille neuf cent soixante et un")+  , (4052739537881, "quatre billions cinquante-deux milliards sept cent trente-neuf millions cinq cent trente-sept mille huit cent quatre-vingt-un")+  , (6557470319842, "six billions cinq cent cinquante-sept milliards quatre cent soixante-dix millions trois cent dix-neuf mille huit cent quarante-deux")+  , (10610209857723, "dix billions six cent dix milliards deux cent neuf millions huit cent cinquante-sept mille sept cent vingt-trois")+  , (17167680177565, "dix-sept billions cent soixante-sept milliards six cent quatre-vingts millions cent soixante-dix-sept mille cinq cent soixante-cinq")+  , (27777890035288, "vingt-sept billions sept cent soixante-dix-sept milliards huit cent quatre-vingt-dix millions trente-cinq mille deux cent quatre-vingt-huit")+  , (44945570212853, "quarante-quatre billions neuf cent quarante-cinq milliards cinq cent soixante-dix millions deux cent douze mille huit cent cinquante-trois")+  , (72723460248141, "soixante-douze billions sept cent vingt-trois milliards quatre cent soixante millions deux cent quarante-huit mille cent quarante et un")+  , (117669030460994, "cent dix-sept billions six cent soixante-neuf milliards trente millions quatre cent soixante mille neuf cent quatre-vingt-quatorze")+  , (190392490709135, "cent quatre-vingt-dix billions trois cent quatre-vingt-douze milliards quatre cent quatre-vingt-dix millions sept cent neuf mille cent trente-cinq")+  , (308061521170129, "trois cent huit billions soixante et un milliards cinq cent vingt et un millions cent soixante-dix mille cent vingt-neuf")+  , (498454011879264, "quatre cent quatre-vingt-dix-huit billions quatre cent cinquante-quatre milliards onze millions huit cent soixante-dix-neuf mille deux cent soixante-quatre")+  , (806515533049393, "huit cent six billions cinq cent quinze milliards cinq cent trente-trois millions quarante-neuf mille trois cent quatre-vingt-treize")+  , (1304969544928657, "un billiard trois cent quatre billions neuf cent soixante-neuf milliards cinq cent quarante-quatre millions neuf cent vingt-huit mille six cent cinquante-sept")+  , (2111485077978050, "deux billiards cent onze billions quatre cent quatre-vingt-cinq milliards soixante-dix-sept millions neuf cent soixante-dix-huit mille cinquante")+  , (3416454622906707, "trois billiards quatre cent seize billions quatre cent cinquante-quatre milliards six cent vingt-deux millions neuf cent six mille sept cent sept")+  , (5527939700884757, "cinq billiards cinq cent vingt-sept billions neuf cent trente-neuf milliards sept cents millions huit cent quatre-vingt-quatre mille sept cent cinquante-sept")+  , (8944394323791464, "huit billiards neuf cent quarante-quatre billions trois cent quatre-vingt-quatorze milliards trois cent vingt-trois millions sept cent quatre-vingt-onze mille quatre cent soixante-quatre")+  , (14472334024676221, "quatorze billiards quatre cent soixante-douze billions trois cent trente-quatre milliards vingt-quatre millions six cent soixante-seize mille deux cent vingt et un")+  , (23416728348467685, "vingt-trois billiards quatre cent seize billions sept cent vingt-huit milliards trois cent quarante-huit millions quatre cent soixante-sept mille six cent quatre-vingt-cinq")+  , (37889062373143906, "trente-sept billiards huit cent quatre-vingt-neuf billions soixante-deux milliards trois cent soixante-treize millions cent quarante-trois mille neuf cent six")+  , (61305790721611591, "soixante et un billiards trois cent cinq billions sept cent quatre-vingt-dix milliards sept cent vingt et un millions six cent onze mille cinq cent quatre-vingt-onze")+  , (99194853094755497, "quatre-vingt-dix-neuf billiards cent quatre-vingt-quatorze billions huit cent cinquante-trois milliards quatre-vingt-quatorze millions sept cent cinquante-cinq mille quatre cent quatre-vingt-dix-sept")+  , (160500643816367088, "cent soixante billiards cinq cents billions six cent quarante-trois milliards huit cent seize millions trois cent soixante-sept mille quatre-vingt-huit")+  , (259695496911122585, "deux cent cinquante-neuf billiards six cent quatre-vingt-quinze billions quatre cent quatre-vingt-seize milliards neuf cent onze millions cent vingt-deux mille cinq cent quatre-vingt-cinq")+  , (420196140727489673, "quatre cent vingt billiards cent quatre-vingt-seize billions cent quarante milliards sept cent vingt-sept millions quatre cent quatre-vingt-neuf mille six cent soixante-treize")+  , (679891637638612258, "six cent soixante-dix-neuf billiards huit cent quatre-vingt-onze billions six cent trente-sept milliards six cent trente-huit millions six cent douze mille deux cent cinquante-huit")+  , (1100087778366101931, "un trillion cent billiards quatre-vingt-sept billions sept cent soixante-dix-huit milliards trois cent soixante-six millions cent un mille neuf cent trente et un")+  , (1779979416004714189, "un trillion sept cent soixante-dix-neuf billiards neuf cent soixante-dix-neuf billions quatre cent seize milliards quatre millions sept cent quatorze mille cent quatre-vingt-neuf")+  , (2880067194370816120, "deux trillions huit cent quatre-vingts billiards soixante-sept billions cent quatre-vingt-quatorze milliards trois cent soixante-dix millions huit cent seize mille cent vingt")+  , (4660046610375530309, "quatre trillions six cent soixante billiards quarante-six billions six cent dix milliards trois cent soixante-quinze millions cinq cent trente mille trois cent neuf")+  , (7540113804746346429, "sept trillions cinq cent quarante billiards cent treize billions huit cent quatre milliards sept cent quarante-six millions trois cent quarante-six mille quatre cent vingt-neuf")+  , (12200160415121876738, "douze trillions deux cents billiards cent soixante billions quatre cent quinze milliards cent vingt et un millions huit cent soixante-seize mille sept cent trente-huit")+  , (19740274219868223167, "dix-neuf trillions sept cent quarante billiards deux cent soixante-quatorze billions deux cent dix-neuf milliards huit cent soixante-huit millions deux cent vingt-trois mille cent soixante-sept")+  , (31940434634990099905, "trente et un trillions neuf cent quarante billiards quatre cent trente-quatre billions six cent trente-quatre milliards neuf cent quatre-vingt-dix millions quatre-vingt-dix-neuf mille neuf cent cinq")+  , (51680708854858323072, "cinquante et un trillions six cent quatre-vingts billiards sept cent huit billions huit cent cinquante-quatre milliards huit cent cinquante-huit millions trois cent vingt-trois mille soixante-douze")+  , (83621143489848422977, "quatre-vingt-trois trillions six cent vingt et un billiards cent quarante-trois billions quatre cent quatre-vingt-neuf milliards huit cent quarante-huit millions quatre cent vingt-deux mille neuf cent soixante-dix-sept")+  , (135301852344706746049, "cent trente-cinq trillions trois cent un billiards huit cent cinquante-deux billions trois cent quarante-quatre milliards sept cent six millions sept cent quarante-six mille quarante-neuf")+  , (218922995834555169026, "deux cent dix-huit trillions neuf cent vingt-deux billiards neuf cent quatre-vingt-quinze billions huit cent trente-quatre milliards cinq cent cinquante-cinq millions cent soixante-neuf mille vingt-six")+  , (354224848179261915075, "trois cent cinquante-quatre trillions deux cent vingt-quatre billiards huit cent quarante-huit billions cent soixante-dix-neuf milliards deux cent soixante et un millions neuf cent quinze mille soixante-quinze")+  , (573147844013817084101, "cinq cent soixante-treize trillions cent quarante-sept billiards huit cent quarante-quatre billions treize milliards huit cent dix-sept millions quatre-vingt-quatre mille cent un")+  , (927372692193078999176, "neuf cent vingt-sept trillions trois cent soixante-douze billiards six cent quatre-vingt-douze billions cent quatre-vingt-treize milliards soixante-dix-huit millions neuf cent quatre-vingt-dix-neuf mille cent soixante-seize")+  , (1500520536206896083277, "un trilliard cinq cents trillions cinq cent vingt billiards cinq cent trente-six billions deux cent six milliards huit cent quatre-vingt-seize millions quatre-vingt-trois mille deux cent soixante-dix-sept")+  , (2427893228399975082453, "deux trilliards quatre cent vingt-sept trillions huit cent quatre-vingt-treize billiards deux cent vingt-huit billions trois cent quatre-vingt-dix-neuf milliards neuf cent soixante-quinze millions quatre-vingt-deux mille quatre cent cinquante-trois")+  , (3928413764606871165730, "trois trilliards neuf cent vingt-huit trillions quatre cent treize billiards sept cent soixante-quatre billions six cent six milliards huit cent soixante et onze millions cent soixante-cinq mille sept cent trente")+  , (6356306993006846248183, "six trilliards trois cent cinquante-six trillions trois cent six billiards neuf cent quatre-vingt-treize billions six milliards huit cent quarante-six millions deux cent quarante-huit mille cent quatre-vingt-trois")+  , (10284720757613717413913, "dix trilliards deux cent quatre-vingt-quatre trillions sept cent vingt billiards sept cent cinquante-sept billions six cent treize milliards sept cent dix-sept millions quatre cent treize mille neuf cent treize")+  , (16641027750620563662096, "seize trilliards six cent quarante et un trillions vingt-sept billiards sept cent cinquante billions six cent vingt milliards cinq cent soixante-trois millions six cent soixante-deux mille quatre-vingt-seize")+  , (26925748508234281076009, "vingt-six trilliards neuf cent vingt-cinq trillions sept cent quarante-huit billiards cinq cent huit billions deux cent trente-quatre milliards deux cent quatre-vingt-un millions soixante-seize mille neuf")+  , (43566776258854844738105, "quarante-trois trilliards cinq cent soixante-six trillions sept cent soixante-seize billiards deux cent cinquante-huit billions huit cent cinquante-quatre milliards huit cent quarante-quatre millions sept cent trente-huit mille cent cinq")+  , (70492524767089125814114, "soixante-dix trilliards quatre cent quatre-vingt-douze trillions cinq cent vingt-quatre billiards sept cent soixante-sept billions quatre-vingt-neuf milliards cent vingt-cinq millions huit cent quatorze mille cent quatorze")+  , (114059301025943970552219, "cent quatorze trilliards cinquante-neuf trillions trois cent un billiards vingt-cinq billions neuf cent quarante-trois milliards neuf cent soixante-dix millions cinq cent cinquante-deux mille deux cent dix-neuf")+  ]++ordinals :: [(Integer, Text)]+ordinals = [+    (0, "zéroième")+  , (1, "premier")+  , (2, "deuxième")+  , (3, "troisième")+  , (4, "quatrième")+  , (5, "cinquième")+  , (6, "sixième")+  , (7, "septième")+  , (8, "huitième")+  , (9, "neuvième")+  , (10, "dixième")+  , (11, "onzième")+  , (12, "douzième")+  , (13, "treizième")+  , (14, "quatorzième")+  , (15, "quinzième")+  , (16, "seizième")+  , (17, "dix-septième")+  , (18, "dix-huitième")+  , (19, "dix-neuvième")+  , (20, "vingtième")+  , (21, "vingt et unième")+  , (22, "vingt-deuxième")+  , (23, "vingt-troisième")+  , (24, "vingt-quatrième")+  , (25, "vingt-cinquième")+  , (26, "vingt-sixième")+  , (27, "vingt-septième")+  , (28, "vingt-huitième")+  , (29, "vingt-neuvième")+  , (30, "trentième")+  , (31, "trente et unième")+  , (32, "trente-deuxième")+  , (33, "trente-troisième")+  , (34, "trente-quatrième")+  , (35, "trente-cinquième")+  , (36, "trente-sixième")+  , (37, "trente-septième")+  , (38, "trente-huitième")+  , (39, "trente-neuvième")+  , (40, "quarantième")+  , (41, "quarante et unième")+  , (42, "quarante-deuxième")+  , (43, "quarante-troisième")+  , (44, "quarante-quatrième")+  , (45, "quarante-cinquième")+  , (46, "quarante-sixième")+  , (47, "quarante-septième")+  , (48, "quarante-huitième")+  , (49, "quarante-neuvième")+  , (50, "cinquantième")+  , (51, "cinquante et unième")+  , (52, "cinquante-deuxième")+  , (53, "cinquante-troisième")+  , (54, "cinquante-quatrième")+  , (55, "cinquante-cinquième")+  , (56, "cinquante-sixième")+  , (57, "cinquante-septième")+  , (58, "cinquante-huitième")+  , (59, "cinquante-neuvième")+  , (60, "soixantième")+  , (61, "soixante et unième")+  , (62, "soixante-deuxième")+  , (63, "soixante-troisième")+  , (64, "soixante-quatrième")+  , (65, "soixante-cinquième")+  , (66, "soixante-sixième")+  , (67, "soixante-septième")+  , (68, "soixante-huitième")+  , (69, "soixante-neuvième")+  , (70, "soixante-dixième")+  , (71, "soixante et onzième")+  , (72, "soixante-douzième")+  , (73, "soixante-treizième")+  , (74, "soixante-quatorzième")+  , (75, "soixante-quinzième")+  , (76, "soixante-seizième")+  , (77, "soixante-dix-septième")+  , (78, "soixante-dix-huitième")+  , (79, "soixante-dix-neuvième")+  , (80, "quatre-vingtsième")+  , (81, "quatre-vingt-unième")+  , (82, "quatre-vingt-deuxième")+  , (83, "quatre-vingt-troisième")+  , (84, "quatre-vingt-quatrième")+  , (85, "quatre-vingt-cinquième")+  , (86, "quatre-vingt-sixième")+  , (87, "quatre-vingt-septième")+  , (88, "quatre-vingt-huitième")+  , (89, "quatre-vingt-neuvième")+  , (90, "quatre-vingt-dixième")+  , (91, "quatre-vingt-onzième")+  , (92, "quatre-vingt-douzième")+  , (93, "quatre-vingt-treizième")+  , (94, "quatre-vingt-quatorzième")+  , (95, "quatre-vingt-quinzième")+  , (96, "quatre-vingt-seizième")+  , (97, "quatre-vingt-dix-septième")+  , (98, "quatre-vingt-dix-huitième")+  , (99, "quatre-vingt-dix-neuvième")+  , (100, "centième")+  , (101, "cent unième")+  , (102, "cent deuxième")+  , (103, "cent troisième")+  , (104, "cent quatrième")+  , (105, "cent cinquième")+  , (106, "cent sixième")+  , (107, "cent septième")+  , (108, "cent huitième")+  , (109, "cent neuvième")+  , (110, "cent dixième")+  , (111, "cent onzième")+  , (112, "cent douzième")+  , (113, "cent treizième")+  , (114, "cent quatorzième")+  , (115, "cent quinzième")+  , (116, "cent seizième")+  , (117, "cent dix-septième")+  , (118, "cent dix-huitième")+  , (119, "cent dix-neuvième")+  , (120, "cent vingtième")+  , (121, "cent vingt et unième")+  , (122, "cent vingt-deuxième")+  , (123, "cent vingt-troisième")+  , (124, "cent vingt-quatrième")+  , (125, "cent vingt-cinquième")+  , (126, "cent vingt-sixième")+  , (127, "cent vingt-septième")+  , (128, "cent vingt-huitième")+  , (129, "cent vingt-neuvième")+  , (130, "cent trentième")+  , (131, "cent trente et unième")+  , (132, "cent trente-deuxième")+  , (133, "cent trente-troisième")+  , (134, "cent trente-quatrième")+  , (135, "cent trente-cinquième")+  , (136, "cent trente-sixième")+  , (137, "cent trente-septième")+  , (138, "cent trente-huitième")+  , (139, "cent trente-neuvième")+  , (140, "cent quarantième")+  , (141, "cent quarante et unième")+  , (142, "cent quarante-deuxième")+  , (143, "cent quarante-troisième")+  , (144, "cent quarante-quatrième")+  , (145, "cent quarante-cinquième")+  , (146, "cent quarante-sixième")+  , (147, "cent quarante-septième")+  , (148, "cent quarante-huitième")+  , (149, "cent quarante-neuvième")+  , (150, "cent cinquantième")+  , (151, "cent cinquante et unième")+  , (152, "cent cinquante-deuxième")+  , (153, "cent cinquante-troisième")+  , (154, "cent cinquante-quatrième")+  , (155, "cent cinquante-cinquième")+  , (156, "cent cinquante-sixième")+  , (157, "cent cinquante-septième")+  , (158, "cent cinquante-huitième")+  , (159, "cent cinquante-neuvième")+  , (160, "cent soixantième")+  , (161, "cent soixante et unième")+  , (162, "cent soixante-deuxième")+  , (163, "cent soixante-troisième")+  , (164, "cent soixante-quatrième")+  , (165, "cent soixante-cinquième")+  , (166, "cent soixante-sixième")+  , (167, "cent soixante-septième")+  , (168, "cent soixante-huitième")+  , (169, "cent soixante-neuvième")+  , (170, "cent soixante-dixième")+  , (171, "cent soixante et onzième")+  , (172, "cent soixante-douzième")+  , (173, "cent soixante-treizième")+  , (174, "cent soixante-quatorzième")+  , (175, "cent soixante-quinzième")+  , (176, "cent soixante-seizième")+  , (177, "cent soixante-dix-septième")+  , (178, "cent soixante-dix-huitième")+  , (179, "cent soixante-dix-neuvième")+  , (180, "cent quatre-vingtsième")+  , (181, "cent quatre-vingt-unième")+  , (182, "cent quatre-vingt-deuxième")+  , (183, "cent quatre-vingt-troisième")+  , (184, "cent quatre-vingt-quatrième")+  , (185, "cent quatre-vingt-cinquième")+  , (186, "cent quatre-vingt-sixième")+  , (187, "cent quatre-vingt-septième")+  , (188, "cent quatre-vingt-huitième")+  , (189, "cent quatre-vingt-neuvième")+  , (190, "cent quatre-vingt-dixième")+  , (191, "cent quatre-vingt-onzième")+  , (192, "cent quatre-vingt-douzième")+  , (193, "cent quatre-vingt-treizième")+  , (194, "cent quatre-vingt-quatorzième")+  , (195, "cent quatre-vingt-quinzième")+  , (196, "cent quatre-vingt-seizième")+  , (197, "cent quatre-vingt-dix-septième")+  , (198, "cent quatre-vingt-dix-huitième")+  , (199, "cent quatre-vingt-dix-neuvième")+  , (200, "deux centsième")+  , (233, "deux cent trente-troisième")+  , (377, "trois cent soixante-dix-septième")+  , (610, "six cent dixième")+  , (987, "neuf cent quatre-vingt-septième")+  , (1597, "mille cinq cent quatre-vingt-dix-septième")+  , (2584, "deux mille cinq cent quatre-vingt-quatrième")+  , (4181, "quatre mille cent quatre-vingt-unième")+  , (6765, "six mille sept cent soixante-cinquième")+  , (10946, "dix mille neuf cent quarante-sixième")+  , (17711, "dix-sept mille sept cent onzième")+  , (28657, "vingt-huit mille six cent cinquante-septième")+  , (46368, "quarante-six mille trois cent soixante-huitième")+  , (75025, "soixante-quinze mille vingt-cinquième")+  , (121393, "cent vingt et un mille trois cent quatre-vingt-treizième")+  , (196418, "cent quatre-vingt-seize mille quatre cent dix-huitième")+  , (317811, "trois cent dix-sept mille huit cent onzième")+  , (514229, "cinq cent quatorze mille deux cent vingt-neuvième")+  , (832040, "huit cent trente-deux mille quarantième")+  , (1346269, "un million trois cent quarante-six mille deux cent soixante-neuvième")+  , (2178309, "deux millions cent soixante-dix-huit mille trois cent neuvième")+  , (3524578, "trois millions cinq cent vingt-quatre mille cinq cent soixante-dix-huitième")+  , (5702887, "cinq millions sept cent deux mille huit cent quatre-vingt-septième")+  , (9227465, "neuf millions deux cent vingt-sept mille quatre cent soixante-cinquième")+  , (14930352, "quatorze millions neuf cent trente mille trois cent cinquante-deuxième")+  , (24157817, "vingt-quatre millions cent cinquante-sept mille huit cent dix-septième")+  , (39088169, "trente-neuf millions quatre-vingt-huit mille cent soixante-neuvième")+  , (63245986, "soixante-trois millions deux cent quarante-cinq mille neuf cent quatre-vingt-sixième")+  , (102334155, "cent deux millions trois cent trente-quatre mille cent cinquante-cinquième")+  , (165580141, "cent soixante-cinq millions cinq cent quatre-vingt mille cent quarante et unième")+  , (267914296, "deux cent soixante-sept millions neuf cent quatorze mille deux cent quatre-vingt-seizième")+  , (433494437, "quatre cent trente-trois millions quatre cent quatre-vingt-quatorze mille quatre cent trente-septième")+  , (701408733, "sept cent un millions quatre cent huit mille sept cent trente-troisième")+  , (1134903170, "un milliard cent trente-quatre millions neuf cent trois mille cent soixante-dixième")+  , (1836311903, "un milliard huit cent trente-six millions trois cent onze mille neuf cent troisième")+  , (2971215073, "deux milliards neuf cent soixante et onze millions deux cent quinze mille soixante-treizième")+  , (4807526976, "quatre milliards huit cent sept millions cinq cent vingt-six mille neuf cent soixante-seizième")+  , (7778742049, "sept milliards sept cent soixante-dix-huit millions sept cent quarante-deux mille quarante-neuvième")+  , (12586269025, "douze milliards cinq cent quatre-vingt-six millions deux cent soixante-neuf mille vingt-cinquième")+  , (20365011074, "vingt milliards trois cent soixante-cinq millions onze mille soixante-quatorzième")+  , (32951280099, "trente-deux milliards neuf cent cinquante et un millions deux cent quatre-vingt mille quatre-vingt-dix-neuvième")+  , (53316291173, "cinquante-trois milliards trois cent seize millions deux cent quatre-vingt-onze mille cent soixante-treizième")+  , (86267571272, "quatre-vingt-six milliards deux cent soixante-sept millions cinq cent soixante et onze mille deux cent soixante-douzième")+  , (139583862445, "cent trente-neuf milliards cinq cent quatre-vingt-trois millions huit cent soixante-deux mille quatre cent quarante-cinquième")+  , (225851433717, "deux cent vingt-cinq milliards huit cent cinquante et un millions quatre cent trente-trois mille sept cent dix-septième")+  , (365435296162, "trois cent soixante-cinq milliards quatre cent trente-cinq millions deux cent quatre-vingt-seize mille cent soixante-deuxième")+  , (591286729879, "cinq cent quatre-vingt-onze milliards deux cent quatre-vingt-six millions sept cent vingt-neuf mille huit cent soixante-dix-neuvième")+  , (956722026041, "neuf cent cinquante-six milliards sept cent vingt-deux millions vingt-six mille quarante et unième")+  , (1548008755920, "un billion cinq cent quarante-huit milliards huit millions sept cent cinquante-cinq mille neuf cent vingtième")+  , (2504730781961, "deux billions cinq cent quatre milliards sept cent trente millions sept cent quatre-vingt-un mille neuf cent soixante et unième")+  , (4052739537881, "quatre billions cinquante-deux milliards sept cent trente-neuf millions cinq cent trente-sept mille huit cent quatre-vingt-unième")+  , (6557470319842, "six billions cinq cent cinquante-sept milliards quatre cent soixante-dix millions trois cent dix-neuf mille huit cent quarante-deuxième")+  , (10610209857723, "dix billions six cent dix milliards deux cent neuf millions huit cent cinquante-sept mille sept cent vingt-troisième")+  , (17167680177565, "dix-sept billions cent soixante-sept milliards six cent quatre-vingts millions cent soixante-dix-sept mille cinq cent soixante-cinquième")+  , (27777890035288, "vingt-sept billions sept cent soixante-dix-sept milliards huit cent quatre-vingt-dix millions trente-cinq mille deux cent quatre-vingt-huitième")+  , (44945570212853, "quarante-quatre billions neuf cent quarante-cinq milliards cinq cent soixante-dix millions deux cent douze mille huit cent cinquante-troisième")+  , (72723460248141, "soixante-douze billions sept cent vingt-trois milliards quatre cent soixante millions deux cent quarante-huit mille cent quarante et unième")+  , (117669030460994, "cent dix-sept billions six cent soixante-neuf milliards trente millions quatre cent soixante mille neuf cent quatre-vingt-quatorzième")+  , (190392490709135, "cent quatre-vingt-dix billions trois cent quatre-vingt-douze milliards quatre cent quatre-vingt-dix millions sept cent neuf mille cent trente-cinquième")+  , (308061521170129, "trois cent huit billions soixante et un milliards cinq cent vingt et un millions cent soixante-dix mille cent vingt-neuvième")+  , (498454011879264, "quatre cent quatre-vingt-dix-huit billions quatre cent cinquante-quatre milliards onze millions huit cent soixante-dix-neuf mille deux cent soixante-quatrième")+  , (806515533049393, "huit cent six billions cinq cent quinze milliards cinq cent trente-trois millions quarante-neuf mille trois cent quatre-vingt-treizième")+  , (1304969544928657, "un billiard trois cent quatre billions neuf cent soixante-neuf milliards cinq cent quarante-quatre millions neuf cent vingt-huit mille six cent cinquante-septième")+  , (2111485077978050, "deux billiards cent onze billions quatre cent quatre-vingt-cinq milliards soixante-dix-sept millions neuf cent soixante-dix-huit mille cinquantième")+  , (3416454622906707, "trois billiards quatre cent seize billions quatre cent cinquante-quatre milliards six cent vingt-deux millions neuf cent six mille sept cent septième")+  , (5527939700884757, "cinq billiards cinq cent vingt-sept billions neuf cent trente-neuf milliards sept cents millions huit cent quatre-vingt-quatre mille sept cent cinquante-septième")+  , (8944394323791464, "huit billiards neuf cent quarante-quatre billions trois cent quatre-vingt-quatorze milliards trois cent vingt-trois millions sept cent quatre-vingt-onze mille quatre cent soixante-quatrième")+  , (14472334024676221, "quatorze billiards quatre cent soixante-douze billions trois cent trente-quatre milliards vingt-quatre millions six cent soixante-seize mille deux cent vingt et unième")+  , (23416728348467685, "vingt-trois billiards quatre cent seize billions sept cent vingt-huit milliards trois cent quarante-huit millions quatre cent soixante-sept mille six cent quatre-vingt-cinquième")+  , (37889062373143906, "trente-sept billiards huit cent quatre-vingt-neuf billions soixante-deux milliards trois cent soixante-treize millions cent quarante-trois mille neuf cent sixième")+  , (61305790721611591, "soixante et un billiards trois cent cinq billions sept cent quatre-vingt-dix milliards sept cent vingt et un millions six cent onze mille cinq cent quatre-vingt-onzième")+  , (99194853094755497, "quatre-vingt-dix-neuf billiards cent quatre-vingt-quatorze billions huit cent cinquante-trois milliards quatre-vingt-quatorze millions sept cent cinquante-cinq mille quatre cent quatre-vingt-dix-septième")+  , (160500643816367088, "cent soixante billiards cinq cents billions six cent quarante-trois milliards huit cent seize millions trois cent soixante-sept mille quatre-vingt-huitième")+  , (259695496911122585, "deux cent cinquante-neuf billiards six cent quatre-vingt-quinze billions quatre cent quatre-vingt-seize milliards neuf cent onze millions cent vingt-deux mille cinq cent quatre-vingt-cinquième")+  , (420196140727489673, "quatre cent vingt billiards cent quatre-vingt-seize billions cent quarante milliards sept cent vingt-sept millions quatre cent quatre-vingt-neuf mille six cent soixante-treizième")+  , (679891637638612258, "six cent soixante-dix-neuf billiards huit cent quatre-vingt-onze billions six cent trente-sept milliards six cent trente-huit millions six cent douze mille deux cent cinquante-huitième")+  , (1100087778366101931, "un trillion cent billiards quatre-vingt-sept billions sept cent soixante-dix-huit milliards trois cent soixante-six millions cent un mille neuf cent trente et unième")+  , (1779979416004714189, "un trillion sept cent soixante-dix-neuf billiards neuf cent soixante-dix-neuf billions quatre cent seize milliards quatre millions sept cent quatorze mille cent quatre-vingt-neuvième")+  , (2880067194370816120, "deux trillions huit cent quatre-vingts billiards soixante-sept billions cent quatre-vingt-quatorze milliards trois cent soixante-dix millions huit cent seize mille cent vingtième")+  , (4660046610375530309, "quatre trillions six cent soixante billiards quarante-six billions six cent dix milliards trois cent soixante-quinze millions cinq cent trente mille trois cent neuvième")+  , (7540113804746346429, "sept trillions cinq cent quarante billiards cent treize billions huit cent quatre milliards sept cent quarante-six millions trois cent quarante-six mille quatre cent vingt-neuvième")+  , (12200160415121876738, "douze trillions deux cents billiards cent soixante billions quatre cent quinze milliards cent vingt et un millions huit cent soixante-seize mille sept cent trente-huitième")+  , (19740274219868223167, "dix-neuf trillions sept cent quarante billiards deux cent soixante-quatorze billions deux cent dix-neuf milliards huit cent soixante-huit millions deux cent vingt-trois mille cent soixante-septième")+  , (31940434634990099905, "trente et un trillions neuf cent quarante billiards quatre cent trente-quatre billions six cent trente-quatre milliards neuf cent quatre-vingt-dix millions quatre-vingt-dix-neuf mille neuf cent cinquième")+  , (51680708854858323072, "cinquante et un trillions six cent quatre-vingts billiards sept cent huit billions huit cent cinquante-quatre milliards huit cent cinquante-huit millions trois cent vingt-trois mille soixante-douzième")+  , (83621143489848422977, "quatre-vingt-trois trillions six cent vingt et un billiards cent quarante-trois billions quatre cent quatre-vingt-neuf milliards huit cent quarante-huit millions quatre cent vingt-deux mille neuf cent soixante-dix-septième")+  , (135301852344706746049, "cent trente-cinq trillions trois cent un billiards huit cent cinquante-deux billions trois cent quarante-quatre milliards sept cent six millions sept cent quarante-six mille quarante-neuvième")+  , (218922995834555169026, "deux cent dix-huit trillions neuf cent vingt-deux billiards neuf cent quatre-vingt-quinze billions huit cent trente-quatre milliards cinq cent cinquante-cinq millions cent soixante-neuf mille vingt-sixième")+  , (354224848179261915075, "trois cent cinquante-quatre trillions deux cent vingt-quatre billiards huit cent quarante-huit billions cent soixante-dix-neuf milliards deux cent soixante et un millions neuf cent quinze mille soixante-quinzième")+  , (573147844013817084101, "cinq cent soixante-treize trillions cent quarante-sept billiards huit cent quarante-quatre billions treize milliards huit cent dix-sept millions quatre-vingt-quatre mille cent unième")+  , (927372692193078999176, "neuf cent vingt-sept trillions trois cent soixante-douze billiards six cent quatre-vingt-douze billions cent quatre-vingt-treize milliards soixante-dix-huit millions neuf cent quatre-vingt-dix-neuf mille cent soixante-seizième")+  , (1500520536206896083277, "un trilliard cinq cents trillions cinq cent vingt billiards cinq cent trente-six billions deux cent six milliards huit cent quatre-vingt-seize millions quatre-vingt-trois mille deux cent soixante-dix-septième")+  , (2427893228399975082453, "deux trilliards quatre cent vingt-sept trillions huit cent quatre-vingt-treize billiards deux cent vingt-huit billions trois cent quatre-vingt-dix-neuf milliards neuf cent soixante-quinze millions quatre-vingt-deux mille quatre cent cinquante-troisième")+  , (3928413764606871165730, "trois trilliards neuf cent vingt-huit trillions quatre cent treize billiards sept cent soixante-quatre billions six cent six milliards huit cent soixante et onze millions cent soixante-cinq mille sept cent trentième")+  , (6356306993006846248183, "six trilliards trois cent cinquante-six trillions trois cent six billiards neuf cent quatre-vingt-treize billions six milliards huit cent quarante-six millions deux cent quarante-huit mille cent quatre-vingt-troisième")+  , (10284720757613717413913, "dix trilliards deux cent quatre-vingt-quatre trillions sept cent vingt billiards sept cent cinquante-sept billions six cent treize milliards sept cent dix-sept millions quatre cent treize mille neuf cent treizième")+  , (16641027750620563662096, "seize trilliards six cent quarante et un trillions vingt-sept billiards sept cent cinquante billions six cent vingt milliards cinq cent soixante-trois millions six cent soixante-deux mille quatre-vingt-seizième")+  , (26925748508234281076009, "vingt-six trilliards neuf cent vingt-cinq trillions sept cent quarante-huit billiards cinq cent huit billions deux cent trente-quatre milliards deux cent quatre-vingt-un millions soixante-seize mille neuvième")+  , (43566776258854844738105, "quarante-trois trilliards cinq cent soixante-six trillions sept cent soixante-seize billiards deux cent cinquante-huit billions huit cent cinquante-quatre milliards huit cent quarante-quatre millions sept cent trente-huit mille cent cinquième")+  , (70492524767089125814114, "soixante-dix trilliards quatre cent quatre-vingt-douze trillions cinq cent vingt-quatre billiards sept cent soixante-sept billions quatre-vingt-neuf milliards cent vingt-cinq millions huit cent quatorze mille cent quatorzième")+  , (114059301025943970552219, "cent quatorze trilliards cinquante-neuf trillions trois cent un billiards vingt-cinq billions neuf cent quarante-trois milliards neuf cent soixante-dix millions cinq cent cinquante-deux mille deux cent dix-neuvième")+  ]