diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 225fdc9..7fa46ec 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -2,6 +2,6 @@ Fixes #
 
 Changes proposed in this pull request:
 
- * 
- * 
- * 
+* 
+* 
+* 
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 50a676f..3883da1 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,6 @@
 repos:
   - repo: https://github.com/asottile/pyupgrade
-    rev: v2.0.1
+    rev: v2.1.0
     hooks:
       - id: pyupgrade
         args: ["--py3-plus"]
@@ -18,7 +18,7 @@ repos:
         additional_dependencies: [flake8-2020, flake8-implicit-str-concat]
 
   - repo: https://github.com/asottile/seed-isort-config
-    rev: v1.9.4
+    rev: v2.1.0
     hooks:
       - id: seed-isort-config
 
diff --git a/src/humanize/number.py b/src/humanize/number.py
index ffe257f..f57588e 100644
--- a/src/humanize/number.py
+++ b/src/humanize/number.py
@@ -106,16 +106,23 @@ def intword(value, format="%.1f"):
 
 
 def apnumber(value):
-    """For numbers 1-9, returns the number spelled out. Otherwise, returns the
-    number. This follows Associated Press style.  This always returns a string
-    unless the value was not int-able, unlike the Django filter."""
+    """Converts an integer to Associated Press style.
+
+    Args:
+        value (int, float, string): Integer to convert.
+
+    Returns:
+        str: For numbers 0-9, the number spelled out. Otherwise, the number. This always
+        returns a string unless the value was not int-able, unlike the Django filter.
+    """
     try:
         value = int(value)
     except (TypeError, ValueError):
         return value
-    if not 0 < value < 10:
+    if not 0 <= value < 10:
         return str(value)
     return (
+        _("zero"),
         _("one"),
         _("two"),
         _("three"),
@@ -125,7 +132,7 @@ def apnumber(value):
         _("seven"),
         _("eight"),
         _("nine"),
-    )[value - 1]
+    )[value]
 
 
 def fractional(value):

humanize.apnumber(0) should return zero
`humanize.appnumber` returns 0 for 0, while (I think) it should return 'zero':

```pycon
>>> import humanize
>>> humanize.apnumber(0)
'0'
>>> humanize.apnumber(1)
'one'
>>> humanize.apnumber(2)
'two'
>>>
```
diff --git a/tests/test_number.py b/tests/test_number.py
index 4b827d3..cdb0d7c 100644
--- a/tests/test_number.py
+++ b/tests/test_number.py
@@ -86,6 +86,7 @@ def test_intword(test_args, expected):
 @pytest.mark.parametrize(
     "test_input, expected",
     [
+        (0, "zero"),
         (1, "one"),
         (2, "two"),
         (4, "four"),

pip install -e .[tests]
parse_log_pytest
requirements.txt
pytest pytest-cov
pip install -U pip pip install -U tox-travis
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi @ file:///croot/certifi_1671487769961/work/certifi
coverage==7.2.7
distlib==0.3.9
exceptiongroup==1.2.2
filelock==3.12.2
freezegun==1.5.1
-e git+https://github.com/jmoiron/humanize.git@aaca29f35306c48c9965047ac5d39807a33652a7#egg=humanize
importlib-metadata==6.7.0
iniconfig==2.0.0
packaging==24.0
platformdirs==4.0.0
pluggy==1.2.0
py==1.11.0
pytest==7.4.4
pytest-cov==4.1.0
python-dateutil==2.9.0.post0
six==1.17.0
tomli==2.0.1
tox==3.28.0
tox-travis==0.13
typing_extensions==4.7.1
virtualenv==20.26.6
zipp==3.15.0

name: humanize
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.2.7
      - distlib==0.3.9
      - exceptiongroup==1.2.2
      - filelock==3.12.2
      - freezegun==1.5.1
      - humanize==2.0.0
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - packaging==24.0
      - pip==24.0
      - platformdirs==4.0.0
      - pluggy==1.2.0
      - py==1.11.0
      - pytest==7.4.4
      - pytest-cov==4.1.0
      - python-dateutil==2.9.0.post0
      - six==1.17.0
      - tomli==2.0.1
      - tox==3.28.0
      - tox-travis==0.13
      - typing-extensions==4.7.1
      - virtualenv==20.26.6
      - zipp==3.15.0
prefix: /opt/conda/envs/humanize

tests/test_number.py::test_apnumber[0-zero]
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[100-1000] tests/test_number.py::test_intcomma[1000-1,0000] tests/test_number.py::test_intcomma[10123-10,1230] tests/test_number.py::test_intcomma[10311-10,3110] tests/test_number.py::test_intcomma[1000000-1,000,0000] tests/test_number.py::test_intcomma[1234567.25-1,234,567.25] tests/test_number.py::test_intcomma[100-1001] tests/test_number.py::test_intcomma[1000-1,0001] tests/test_number.py::test_intcomma[10123-10,1231] tests/test_number.py::test_intcomma[10311-10,3111] tests/test_number.py::test_intcomma[1000000-1,000,0001] tests/test_number.py::test_intcomma[1234567.1234567-1,234,567.1234567] tests/test_number.py::test_intcomma[None-None] 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[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
.github/PULL_REQUEST_TEMPLATE.md .pre-commit-config.yaml src/humanize/number.py
.github/PULL_REQUEST_TEMPLATE.md .pre-commit-config.yaml src/humanize/number.py