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 +8/−0
- LICENSE +30/−0
- README.md +73/−0
- Setup.hs +3/−0
- ordinal.cabal +74/−0
- src/Text/Numerals.hs +21/−0
- src/Text/Numerals/Algorithm.hs +178/−0
- src/Text/Numerals/Algorithm/Template.hs +65/−0
- src/Text/Numerals/Class.hs +100/−0
- src/Text/Numerals/Internal.hs +83/−0
- src/Text/Numerals/Languages.hs +17/−0
- src/Text/Numerals/Languages/Dutch.hs +147/−0
- src/Text/Numerals/Languages/English.hs +124/−0
- src/Text/Numerals/Languages/French.hs +125/−0
- src/Text/Numerals/Prefix.hs +55/−0
- test/Main.hs +3/−0
- test/Text/Numerals/LanguageTest.hs +36/−0
- test/Text/Numerals/Languages/DutchSpec.hs +622/−0
- test/Text/Numerals/Languages/EnglishSpec.hs +622/−0
- test/Text/Numerals/Languages/FrenchSpec.hs +622/−0
+ 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++[](https://travis-ci.com/hapytex/ordinal)+[](https://matrix.hackage.haskell.org/#/package/ordinal)+[](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")+ ]