diff --git a/src/humanize/number.py b/src/humanize/number.py
index f57588e..013448e 100644
--- a/src/humanize/number.py
+++ b/src/humanize/number.py
@@ -35,11 +35,19 @@ def ordinal(value):
     return "%d%s" % (value, t[value % 10])
 
 
-def intcomma(value):
+def intcomma(value, ndigits=None):
     """Converts an integer to a string containing commas every three digits.
-    For example, 3000 becomes '3,000' and 45000 becomes '45,000'.  To maintain
-    some compatibility with Django's intcomma, this function also accepts
-    floats."""
+
+    For example, 3000 becomes "3,000" and 45000 becomes "45,000". To maintain some
+    compatibility with Django's intcomma, this function also accepts floats.
+
+    Args:
+        value (int, float, string): Integer or float to convert.
+        ndigits (int, None): digits of precision for rounding after the decimal point.
+
+    Returns:
+        str: string containing commas every three digits.
+    """
     try:
         if isinstance(value, str):
             float(value.replace(",", ""))
@@ -47,7 +55,12 @@ def intcomma(value):
             float(value)
     except (TypeError, ValueError):
         return value
-    orig = str(value)
+
+    if ndigits:
+        orig = "{0:.{1}f}".format(value, ndigits)
+    else:
+        orig = str(value)
+
     new = re.sub(r"^(-?\d+)(\d{3})", r"\g<1>,\g<2>", orig)
     if orig == new:
         return new

diff --git a/tests/test_number.py b/tests/test_number.py
index cdb0d7c..c7cbc66 100644
--- a/tests/test_number.py
+++ b/tests/test_number.py
@@ -30,25 +30,36 @@ def test_ordinal(test_input, expected):
 
 
 @pytest.mark.parametrize(
-    "test_input, expected",
+    "test_args, expected",
     [
-        (100, "100"),
-        (1000, "1,000"),
-        (10123, "10,123"),
-        (10311, "10,311"),
-        (1000000, "1,000,000"),
-        (1234567.25, "1,234,567.25"),
-        ("100", "100"),
-        ("1000", "1,000"),
-        ("10123", "10,123"),
-        ("10311", "10,311"),
-        ("1000000", "1,000,000"),
-        ("1234567.1234567", "1,234,567.1234567"),
-        (None, None),
+        ([100], "100"),
+        ([1000], "1,000"),
+        ([10123], "10,123"),
+        ([10311], "10,311"),
+        ([1000000], "1,000,000"),
+        ([1234567.25], "1,234,567.25"),
+        (["100"], "100"),
+        (["1000"], "1,000"),
+        (["10123"], "10,123"),
+        (["10311"], "10,311"),
+        (["1000000"], "1,000,000"),
+        (["1234567.1234567"], "1,234,567.1234567"),
+        ([None], None),
+        ([14308.40], "14,308.4"),
+        ([14308.40, None], "14,308.4"),
+        ([14308.40, 1], "14,308.4"),
+        ([14308.40, 2], "14,308.40"),
+        ([14308.40, 3], "14,308.400"),
+        ([1234.5454545], "1,234.5454545"),
+        ([1234.5454545, None], "1,234.5454545"),
+        ([1234.5454545, 1], "1,234.5"),
+        ([1234.5454545, 2], "1,234.55"),
+        ([1234.5454545, 3], "1,234.545"),
+        ([1234.5454545, 10], "1,234.5454545000"),
     ],
 )
-def test_intcomma(test_input, expected):
-    assert humanize.intcomma(test_input) == expected
+def test_intcomma(test_args, expected):
+    assert humanize.intcomma(*test_args) == expected
 
 
 def test_intword_powers():

intcomma() variant needed to handle money
When using intcomma on a dollar value like 14308.40, I get '14,308.4'.

It would be nice to have a moneycomma(14308.40,2) which gives me '14,308.40'.

tests/test_number.py::test_intcomma[test_args14-14,308.4] tests/test_number.py::test_intcomma[test_args15-14,308.4] tests/test_number.py::test_intcomma[test_args16-14,308.40] tests/test_number.py::test_intcomma[test_args17-14,308.400] tests/test_number.py::test_intcomma[test_args19-1,234.5454545] tests/test_number.py::test_intcomma[test_args20-1,234.5] tests/test_number.py::test_intcomma[test_args21-1,234.55] tests/test_number.py::test_intcomma[test_args22-1,234.545] tests/test_number.py::test_intcomma[test_args23-1,234.5454545000]
tests/test_number.py::test_ordinal[1-1st] tests/test_number.py::test_ordinal[2-2nd] tests/test_number.py::test_ordinal[3-3rd] tests/test_number.py::test_ordinal[4-4th] tests/test_number.py::test_ordinal[11-11th] tests/test_number.py::test_ordinal[12-12th] tests/test_number.py::test_ordinal[13-13th] tests/test_number.py::test_ordinal[101-101st] tests/test_number.py::test_ordinal[102-102nd] tests/test_number.py::test_ordinal[103-103rd] tests/test_number.py::test_ordinal[111-111th] tests/test_number.py::test_ordinal[something tests/test_number.py::test_ordinal[None-None] tests/test_number.py::test_intcomma[test_args0-100] tests/test_number.py::test_intcomma[test_args1-1,000] tests/test_number.py::test_intcomma[test_args2-10,123] tests/test_number.py::test_intcomma[test_args3-10,311] tests/test_number.py::test_intcomma[test_args4-1,000,000] tests/test_number.py::test_intcomma[test_args5-1,234,567.25] tests/test_number.py::test_intcomma[test_args6-100] tests/test_number.py::test_intcomma[test_args7-1,000] tests/test_number.py::test_intcomma[test_args8-10,123] tests/test_number.py::test_intcomma[test_args9-10,311] tests/test_number.py::test_intcomma[test_args10-1,000,000] tests/test_number.py::test_intcomma[test_args11-1,234,567.1234567] tests/test_number.py::test_intcomma[test_args12-None] tests/test_number.py::test_intcomma[test_args13-14,308.4] tests/test_number.py::test_intcomma[test_args18-1,234.5454545] tests/test_number.py::test_intword_powers tests/test_number.py::test_intword[test_args0-100] tests/test_number.py::test_intword[test_args1-1.0 tests/test_number.py::test_intword[test_args2-1.2 tests/test_number.py::test_intword[test_args3-1.3 tests/test_number.py::test_intword[test_args4-1.0 tests/test_number.py::test_intword[test_args5-1.0 tests/test_number.py::test_intword[test_args6-2.0 tests/test_number.py::test_intword[test_args7-1.0 tests/test_number.py::test_intword[test_args8-1.0 tests/test_number.py::test_intword[test_args9-6.0 tests/test_number.py::test_intword[test_args10-1.0 tests/test_number.py::test_intword[test_args11-1.0 tests/test_number.py::test_intword[test_args12-1.3 tests/test_number.py::test_intword[test_args13-3.5 tests/test_number.py::test_intword[test_args14-8.1 tests/test_number.py::test_intword[test_args15-None] tests/test_number.py::test_intword[test_args16-1.23 tests/test_number.py::test_intword[test_args17-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000] tests/test_number.py::test_apnumber[0-zero] tests/test_number.py::test_apnumber[1-one] tests/test_number.py::test_apnumber[2-two] tests/test_number.py::test_apnumber[4-four] tests/test_number.py::test_apnumber[5-five] tests/test_number.py::test_apnumber[9-nine] tests/test_number.py::test_apnumber[10-10] tests/test_number.py::test_apnumber[7-seven] tests/test_number.py::test_apnumber[None-None] tests/test_number.py::test_fractional[1-1] tests/test_number.py::test_fractional[2.0-2] tests/test_number.py::test_fractional[1.3333333333333333-1 tests/test_number.py::test_fractional[0.8333333333333334-5/6] tests/test_number.py::test_fractional[7-7] tests/test_number.py::test_fractional[8.9-8 tests/test_number.py::test_fractional[ten-ten] tests/test_number.py::test_fractional[None-None] tests/test_number.py::test_scientific[test_args0-1.00 tests/test_number.py::test_scientific[test_args1-1.00 tests/test_number.py::test_scientific[test_args2-5.50 tests/test_number.py::test_scientific[test_args3-5.78 tests/test_number.py::test_scientific[test_args4-1.00 tests/test_number.py::test_scientific[test_args5-9.90 tests/test_number.py::test_scientific[test_args6-3.00 tests/test_number.py::test_scientific[test_args7-foo] tests/test_number.py::test_scientific[test_args8-None] tests/test_number.py::test_scientific[test_args9-1.0 tests/test_number.py::test_scientific[test_args10-3.0 tests/test_number.py::test_scientific[test_args11-1 tests/test_number.py::test_scientific[test_args12-3