diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for DigitGroup
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/DigitGroup.cabal b/DigitGroup.cabal
new file mode 100644
--- /dev/null
+++ b/DigitGroup.cabal
@@ -0,0 +1,67 @@
+-- Initial DigitGroup.cabal generated by cabal init.  For further
+-- documentation, see http://haskell.org/cabal/users-guide/
+
+-- The name of the package.
+name:                DigitGroup
+
+-- The package version.  See the Haskell package versioning policy (PVP)
+-- for standards guiding when and how versions should be incremented.
+-- https://wiki.haskell.org/Package_versioning_policy
+-- PVP summary:      +-+------- breaking API changes
+--                   | | +----- non-breaking API additions
+--                   | | | +--- code changes with no API change
+version:             0.1.0.0
+
+-- A short (one-line) description of the package.
+synopsis: Group the digits of numbers by lots
+
+-- A longer description of the package.
+-- description:
+
+-- The license under which the package is released.
+license:             BSD3
+
+-- The file containing the license text.
+license-file:        LICENSE
+
+-- The package author(s).
+author:              Alan Hawkins
+
+-- An email address to which users can send suggestions, bug reports, and
+-- patches.
+maintainer:          w@xy30.com
+
+-- A copyright notice.
+-- copyright:
+
+category:            Math
+
+build-type:          Simple
+
+-- Extra files to be distributed with the package, such as examples or a
+-- README.
+extra-source-files:  CHANGELOG.md
+
+-- Constraint on the version of Cabal needed to build this package.
+cabal-version:       >=1.10
+
+
+library
+  -- Modules exported by the library.
+  exposed-modules:     Numeric.DigitGroup
+
+  -- Modules included in this library but not exported.
+  -- other-modules:
+
+  -- LANGUAGE extensions used by modules in this package.
+  -- other-extensions:
+
+  -- Other library packages from which modules are imported.
+  build-depends:       base > 4 && <10000, split <10000
+
+  -- Directories containing source files.
+  -- hs-source-dirs:
+
+  -- Base language which the package is written in.
+  default-language:    Haskell2010
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2022, Alan Hawkins
+
+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 Alan Hawkins 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.
diff --git a/Numeric/DigitGroup.hs b/Numeric/DigitGroup.hs
new file mode 100644
--- /dev/null
+++ b/Numeric/DigitGroup.hs
@@ -0,0 +1,45 @@
+module Numeric.DigitGroup where
+
+import Data.List
+import Data.List.Split 
+import Data.Char
+import Numeric
+
+digitGroupIntegral :: Integral a => Char -> p -> a -> [Char]
+digitGroupIntegral separator _ n = (if n < 0 then "-" else "") 
+                  ++ (reverse $ intercalate [separator] $ chunksOf 3 (reverse $ map (intToDigit . fromIntegral)  $ nums n))  
+                  where 
+                   nums x = reverse $  unfoldr (\x -> case  divMod x 10 of  { (0,0) -> Nothing  ; (x,y) -> Just (y,x)}) x  
+
+digitGroupRealFrac :: RealFloat a => Char -> Maybe Char -> a -> [Char]
+digitGroupRealFrac separator1 separator2 n = (if n < 0 then "-" else "") 
+             ++ reverse (intercalate [separator1] (chunksOf 3 $ reverse whole')) 
+             ++ "." ++  intercalate separator2' (chunksOf 3 frac)
+  where 
+  separator2' = case separator2 of { (Just x) -> [x] ; _ -> [] } 
+  whole' = if whole == [] then "0" else whole
+  (whole,frac)  = splitAt y digitString
+  digitString = map intToDigit ( replicate (if y < 0 then abs y else 0 ) 0 ++ xs ++ replicate (y-length xs+if y >= 1 then 1 else 0 ) 0) 
+  (xs,y) = floatToDigits 10 n
+
+
+class DigitGroupShow a where
+  digitGroup :: Char -> Maybe Char -> a -> String
+
+instance DigitGroupShow Integer where
+  digitGroup separator _ x = digitGroupIntegral separator Nothing x
+
+instance DigitGroupShow Int where
+  digitGroup separator _ x = digitGroupIntegral separator Nothing x
+
+instance DigitGroupShow Float where
+  digitGroup separator1 separator2 x = digitGroupRealFrac separator1 separator2 x
+
+instance DigitGroupShow Double where
+  digitGroup separator1 separator2 x = digitGroupRealFrac separator1 separator2 x
+
+digitGroupComma :: DigitGroupShow a => a -> String
+digitGroupComma num = digitGroup ',' (Just ' ') num
+
+digitGroupUnderScore :: DigitGroupShow a => a -> String
+digitGroupUnderScore num = digitGroup '_' (Just '_') num
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
