python-stdnum branch master updated. 2.2
[
Date Prev][
Date Next]
[
Thread Prev][
Thread Next]
python-stdnum branch master updated. 2.2
- From: Commits of the python-stdnum project <python-stdnum-commits [at] lists.arthurdejong.org>
- To: python-stdnum-commits [at] lists.arthurdejong.org
- Reply-to: python-stdnum-users [at] lists.arthurdejong.org, python-stdnum-commits [at] lists.arthurdejong.org
- Subject: python-stdnum branch master updated. 2.2
- Date: Sun, 4 Jan 2026 20:35:23 +0100 (CET)
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "python-stdnum".
The branch, master has been updated
via 52d316200c347b4f3d2b61a77ce746f3d28a3815 (commit)
from e7e900ae801d7bd45860bddf13d7bd93c90ad9cf (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
https://arthurdejong.org/git/python-stdnum/commit/?id=52d316200c347b4f3d2b61a77ce746f3d28a3815
commit 52d316200c347b4f3d2b61a77ce746f3d28a3815
Author: Arthur de Jong <arthur@arthurdejong.org>
Date: Sun Jan 4 20:28:56 2026 +0100
Get files ready for 2.2 release
diff --git a/ChangeLog b/ChangeLog
index a93f5e6..a546b74 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,240 @@
+2026-01-04 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [e7e900a] .github/workflows/test.yml, setup.py, tox.ini: Add
+ support for Python 3.14
+
+2026-01-04 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [97d8cae] stdnum/sn/ninea.py: URL escape the underscore because
+ it confuses Sphinx
+
+2026-01-04 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [6070c60] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat,
+ stdnum/cn/loc.dat, stdnum/cz/banks.dat, stdnum/gs1_ai.dat,
+ stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat,
+ stdnum/nz/banks.dat, stdnum/oui.dat: Update database files
+
+2026-01-04 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [a7fd300] update/at_postleitzahl.py, update/be_banks.py,
+ update/cfi.py, update/cn_loc.py, update/cz_banks.py,
+ update/do_whitelists.py, update/gs1_ai.py, update/iban.py,
+ update/imsi.py, update/isbn.py, update/isil.py, update/nz_banks.py:
+ Consistently pass a user agent for update scripts
+
+ The scourge of AI bots is forcing more and more sites to block
+ bots that don't set particular user agents.
+
+2026-01-04 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [e7afc61] update/be_banks.py: Update download URL of Belgian
+ bank numbers
+
+ This also changes the handling to prefer the English name over
+ other names and handles another variant of not-applicable values.
+
+2026-01-04 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [d332ee1] stdnum/sn/ninea.py, tests/test_sn_ninea.doctest:
+ Add check digit validation to Senegal NINEA
+
+2023-02-12 Leandro Regueiro <leandro.regueiro@gmail.com>
+
+ * [dd22123] stdnum/sn/__init__.py, stdnum/sn/ninea.py,
+ tests/test_sn_ninea.doctest: Add support for Senegal TIN
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/395
+ Closes https://github.com/arthurdejong/python-stdnum/issues/357
+
+2026-01-03 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [d3ec3bd] stdnum/br/cnpj.py: Support new format for Brazilian CNPJ
+
+ The new format allows letters as well as numbers to identify
+ companies.
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/484
+
+2025-02-27 dotbit1 <68584562+dotbit1@users.noreply.github.com>
+
+ * [cd94bf1] stdnum/ro/onrc.py, tests/test_ro_onrc.doctest: Support
+ the new Romanian ONRC format
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/465
+
+2026-01-03 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [293136b] stdnum/lv/pvn.py: Support Latvian personal codes issued
+ after 2017
+
+ These numbers no longer embed a birth date in the format.
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/486
+
+2023-12-08 Cédric Krier <ced@b2ck.com>
+
+ * [a906a1e] stdnum/eu/excise.py, stdnum/fr/__init__.py,
+ stdnum/fr/accise.py, tests/test_fr_accise.doctest: Add accise -
+ the French number for excise
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/424
+
+2023-12-08 Cédric Krier <ced@b2ck.com>
+
+ * [1a254d9] stdnum/eu/excise.py, tests/test_eu_excise.doctest:
+ Add European Excise Number
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/424
+
+2025-09-28 Cédric Krier <ced@b2ck.com>
+
+ * [d534b3c] stdnum/be/ogm_vcs.py: Add Belgian OGM-VCS
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/487
+
+2025-10-14 KathrinM <k.mallot@right-basedonscience.de>
+
+ * [2cf475c] stdnum/eu/nace.py, stdnum/eu/nace20.dat,
+ stdnum/eu/nace21.dat, tests/test_eu_nace.doctest: Add support
+ for nace revision 2.1
+
+ This makes revision 2.1 the default but still allows validating
+ against version 2.0 using the revision argument.
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/490
+
+2025-12-19 Tuukka Tolvanen <ttolvanen@holvi.com>
+
+ * [acda255] stdnum/de/leitweg.py, tests/test_de_leitweg.doctest:
+ Add DE Leitweg-ID
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/491
+
+2025-12-16 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [c7a7fd1] .github/workflows/test.yml: Run flake8 with Python 3.13
+
+ Python version 3.14 no longer works.
+
+2025-10-26 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [7a9b852] stdnum/ro/cnp.py: Mark more Romanian CNP county codes
+ as valid
+
+ According to
+
https://ro.wikipedia.org/wiki/Carte_de_identitate_rom%C3%A2neasc%C4%83#Seriile_c%C4%83r%C8%9Bilor_de_identitate_(%C3%AEn_modelele_emise_%C3%AEnainte_de_2021)
+ 70 is used to represent any registration, regardless of county
+ but while multiple documents claim 80-83 are also valid it is
+ unclear what they represent.
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/489
+
+2025-10-26 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [7ca9b6c] stdnum/be/vat.py, tests/test_be_vat.doctest: Validate
+ first digit of Belgian VAT number
+
+ Thanks to antonio-ginestar find pointing this out.
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/488
+
+2022-09-17 Leandro Regueiro <leandro.regueiro@gmail.com>
+
+ * [a1fdd5d] stdnum/az/__init__.py, stdnum/az/voen.py,
+ tests/test_az_voen.doctest: Add support for Azerbaijan TIN
+
+ Thanks to Adam Handke for finding the weights for the check
+ digit algorithm.
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/200
+ CLoses https://github.com/arthurdejong/python-stdnum/pull/329
+
+2025-08-08 Fabien MICHEL <fmichel@adista.fr>
+
+ * [e741318] stdnum/fr/rcs.py, tests/test_fr_rcs.doctest: Add French
+ RCS number
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/481
+
+2025-08-08 Fabien MICHEL <fmichel@adista.fr>
+
+ * [ca80cc4] stdnum/fr/siren.py: Add fr.siren.format() function
+
+2025-08-08 Fabien MICHEL <fmichel@adista.fr>
+
+ * [b3a42a1] stdnum/fr/tva.py, tests/test_fr_tva.doctest: Add
+ fr.tva.to_siren() function
+
+ The function can convert a French VAT number to a SIREN.
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/480
+
+2025-08-14 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [843bbec] stdnum/bic.py, tests/test_bic.doctest: Add validation
+ of country code in BIC
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/482
+
+2025-06-05 Joni Saarinen <joni.saarinen@onebyte.fi>
+
+ * [deb0db1] stdnum/ee/__init__.py: Add personal id and business
+ id alias for Estonia
+
+ Closes https://github.com/arthurdejong/python-stdnum/pull/476
+
+2025-05-10 Luca <luca.sicu02@gmail.com>
+
+ * [1773a91] stdnum/mz/__init__.py, stdnum/mz/nuit.py,
+ tests/test_mz_nuit.doctest: Add support for Mozambique TIN
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/360
+ Closes https://github.com/arthurdejong/python-stdnum/pull/392
+ Closes https://github.com/arthurdejong/python-stdnum/pull/473
+
+2025-06-01 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [5ef6ade] stdnum/numdb.py: Use broader type ignore for
+ pkg_resources import
+
+ Apparently mypy changed for classifying the problem from
+ import-untyped to import-not-found.
+
+2025-05-25 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [0e64cf6] stdnum/cn/loc.dat, stdnum/cn/ric.py,
+ tests/test_cn_ric.doctest, update/cn_loc.py: Download Chinise
+ location codes from Wikipedia
+
+ The list on GitHub is missing historical information and also
+ appears to no longer be updated. This changes the birth place
+ lookup to take the birth year into account to determine whether
+ a county was assigned at the time.
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/442
+
+2025-05-18 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [210b9ce] stdnum/gs1_128.py, stdnum/gs1_ai.dat,
+ tests/test_gs1_128.doctest, update/gs1_ai.py: Fix handling of
+ decimals in Application Identifiers
+
+ This fixes the handling of GS1-128 Application Identifiers with
+ decimal types. Previously, with some 4 digit decimal application
+ identifiers the number of decimals were incorrectly considered
+ part of the value instead of the application identifier.
+
+ For example (310)5033333 is not correct but it should be evaluated
+ as (3105)033333 (application identifier 3105 and value 0.33333).
+
+ Closes https://github.com/arthurdejong/python-stdnum/issues/471
+
+2025-05-17 Arthur de Jong <arthur@arthurdejong.org>
+
+ * [d66998e] ChangeLog, NEWS, stdnum/__init__.py: Get files ready
+ for 2.1 release
+
2025-05-17 Arthur de Jong <arthur@arthurdejong.org>
* [a753ebf] stdnum/at/postleitzahl.dat, stdnum/cn/loc.dat,
diff --git a/NEWS b/NEWS
index 5e0f4aa..8eb60b3 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,38 @@
+changes from 2.1 to 2.2
+-----------------------
+
+* Add modules for the following number formats:
+
+ - VÖEN (Vergi ödəyicisinin eyniləşdirmə nömrəsi, Azerbaijan tax number)
+ (thanks Leandro Regueiro)
+ - Belgian OGM-VCS
+ (thanks Cédric Krier)
+ - Leitweg-ID, a buyer reference or routing identifier for electronic invoices
+ (thanks Tuukka Tolvanen)
+ - European Excise Number (thanks Cédric Krier)
+ - n° d'accise (French number to identify taxpayers of excise taxes)
+ (thanks Cédric Krier)
+ - RCS (French trade registration number for commercial companies)
+ (thanks Fabien MICHEL)
+ - NUIT (Número Único de Identificação Tributaria, Mozambique tax number)
+ (thanks Luca and Leandro Regueiro)
+ - NINEA (Numéro d'Identification Nationale des Entreprises et Associations,
Senegal tax number)
+ (thanks Leandro Regueiro)
+
+* Fix handling of decimals in Application Identifiers (thanks zipus)
+* Update list of valid Chinese counties (thanks 电子旅人 and Luca)
+* Mark more Romanian CNP county codes as valid (thanks luella-s)
+* Support Latvian personal codes issued after 2017 (thanks José Luis López
Pino)
+* Provide aliases for Estonian numbers (thanks Joni Saarinen)
+* Add validation of country code in BIC (thanks Luuk Gubbels)
+* Add function to convert a French VAT number into a SIREN (thanks Fabien
MICHEL)
+* Add a function to format a French SIREN (thanks Fabien MICHEL)
+* Add extra validation of Belgian VAT numbers (thanks Antonio Ginestar)
+* Add support for nace revision 2.1 (thanks KathrinM)
+* Support the new Romanian ONRC format (thanks dotbit1)
+* Support new format for Brazilian CNPJ (thanks Cloves Oliveira)
+
+
changes from 2.0 to 2.1
-----------------------
diff --git a/README.md b/README.md
index e09a984..908d40c 100644
--- a/README.md
+++ b/README.md
@@ -28,10 +28,12 @@ Currently this package supports the following formats:
* ABN (Australian Business Number)
* ACN (Australian Company Number)
* TFN (Australian Tax File Number)
+ * VÖEN (Vergi ödəyicisinin eyniləşdirmə nömrəsi, Azerbaijan tax number)
* BIS (Belgian BIS number)
* eID Number (Belgian electronic Identity Card Number)
* Belgian IBAN (International Bank Account Number)
* NN, NISS, RRN (Belgian national number)
+ * Belgian OGM-VCS
* SSN, INSZ, NISS (Belgian social security number)
* BTW, TVA, NWSt, ondernemingsnummer (Belgian enterprise number)
* EGN (ЕГН, Единен граждански номер, Bulgarian personal identity codes)
@@ -66,6 +68,7 @@ Currently this package supports the following formats:
* RČ (Rodné číslo, the Czech birth number)
* Handelsregisternummer (German company register number)
* IdNr (Steuerliche Identifikationsnummer, German personal tax number)
+ * Leitweg-ID, a buyer reference or routing identifier for electronic invoices
* St.-Nr. (Steuernummer, German tax number)
* Ust ID Nr. (Umsatzsteur Identifikationnummer, German VAT number)
* Wertpapierkennnummer (German securities identification code)
@@ -96,6 +99,7 @@ Currently this package supports the following formats:
* Euro banknote serial numbers
* EC Number (European Community number)
* EIC (European Energy Identification Code)
+ * European Excise Number
* NACE (classification for businesses in the European Union)
* OSS (European VAT on e-Commerce - One Stop Shop)
* VAT (European Union VAT number)
@@ -106,8 +110,10 @@ Currently this package supports the following formats:
* Y-tunnus (Finnish business identifier)
* FIGI (Financial Instrument Global Identifier)
* V-number (Vinnutal, Faroe Islands tax number)
+ * n° d'accise (French number to identify taxpayers of excise taxes)
* NIF (Numéro d'Immatriculation Fiscale, French tax identification number)
* NIR (French personal identification number)
+ * RCS (French trade registration number for commercial companies)
* SIREN (a French company identification number)
* SIRET (a French company establishment identification number)
* n° TVA (taxe sur la valeur ajoutée, French VAT number)
@@ -179,6 +185,7 @@ Currently this package supports the following formats:
* CURP (Clave Única de Registro de Población, Mexican personal ID)
* RFC (Registro Federal de Contribuyentes, Mexican tax number)
* NRIC No. (Malaysian National Registration Identity Card Number)
+ * NUIT (Número Único de Identificação Tributaria, Mozambique tax number)
* BRIN number (the Dutch school identification number)
* BSN (Burgerservicenummer, the Dutch citizen identification number)
* Btw-identificatienummer (Omzetbelastingnummer, the Dutch VAT number)
@@ -219,6 +226,7 @@ Currently this package supports the following formats:
* IČ DPH (IČ pre daň z pridanej hodnoty, Slovak VAT number)
* RČ (Rodné číslo, the Slovak birth number)
* COE (Codice operatore economico, San Marino national tax number)
+ * NINEA (Numéro d'Identification Nationale des Entreprises et Associations,
Senegal tax number)
* NIT (Número de Identificación Tributaria, El Salvador tax number)
* MOA (Thailand Memorandum of Association Number)
* PIN (Thailand Personal Identification Number)
@@ -296,7 +304,7 @@ Python. The modules are developed and tested with Python 3
versions (see `setup.
Copyright
---------
-Copyright (C) 2010-2025 Arthur de Jong and others
+Copyright (C) 2010-2026 Arthur de Jong and others
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
diff --git a/docs/conf.py b/docs/conf.py
index 70e6774..d37c1cb 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -39,7 +39,7 @@ master_doc = 'index'
# General information about the project.
project = u'python-stdnum'
-copyright = u'2013-2025, Arthur de Jong'
+copyright = u'2013-2026, Arthur de Jong'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
diff --git a/docs/index.rst b/docs/index.rst
index a543b39..7cb0b70 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -126,10 +126,12 @@ Available formats
au.abn
au.acn
au.tfn
+ az.voen
be.bis
be.eid
be.iban
be.nn
+ be.ogm_vcs
be.ssn
be.vat
bg.egn
@@ -164,6 +166,7 @@ Available formats
cz.rc
de.handelsregisternummer
de.idnr
+ de.leitweg
de.stnr
de.vat
de.wkn
@@ -194,6 +197,7 @@ Available formats
eu.banknote
eu.ecnumber
eu.eic
+ eu.excise
eu.nace
eu.oss
eu.vat
@@ -204,8 +208,10 @@ Available formats
fi.ytunnus
figi
fo.vn
+ fr.accise
fr.nif
fr.nir
+ fr.rcs
fr.siren
fr.siret
fr.tva
@@ -277,6 +283,7 @@ Available formats
mx.curp
mx.rfc
my.nric
+ mz.nuit
nl.brin
nl.bsn
nl.btw
@@ -317,6 +324,7 @@ Available formats
sk.dph
sk.rc
sm.coe
+ sn.ninea
sv.nit
th.moa
th.pin
diff --git a/docs/stdnum.az.voen.rst b/docs/stdnum.az.voen.rst
new file mode 100644
index 0000000..8c303dd
--- /dev/null
+++ b/docs/stdnum.az.voen.rst
@@ -0,0 +1,5 @@
+stdnum.az.voen
+==============
+
+.. automodule:: stdnum.az.voen
+ :members:
\ No newline at end of file
diff --git a/docs/stdnum.be.ogm_vcs.rst b/docs/stdnum.be.ogm_vcs.rst
new file mode 100644
index 0000000..efb1854
--- /dev/null
+++ b/docs/stdnum.be.ogm_vcs.rst
@@ -0,0 +1,5 @@
+stdnum.be.ogm_vcs
+=================
+
+.. automodule:: stdnum.be.ogm_vcs
+ :members:
\ No newline at end of file
diff --git a/docs/stdnum.de.leitweg.rst b/docs/stdnum.de.leitweg.rst
new file mode 100644
index 0000000..747e101
--- /dev/null
+++ b/docs/stdnum.de.leitweg.rst
@@ -0,0 +1,5 @@
+stdnum.de.leitweg
+=================
+
+.. automodule:: stdnum.de.leitweg
+ :members:
\ No newline at end of file
diff --git a/docs/stdnum.eu.excise.rst b/docs/stdnum.eu.excise.rst
new file mode 100644
index 0000000..0bfc38f
--- /dev/null
+++ b/docs/stdnum.eu.excise.rst
@@ -0,0 +1,5 @@
+stdnum.eu.excise
+================
+
+.. automodule:: stdnum.eu.excise
+ :members:
\ No newline at end of file
diff --git a/docs/stdnum.fr.accise.rst b/docs/stdnum.fr.accise.rst
new file mode 100644
index 0000000..3c5b93d
--- /dev/null
+++ b/docs/stdnum.fr.accise.rst
@@ -0,0 +1,5 @@
+stdnum.fr.accise
+================
+
+.. automodule:: stdnum.fr.accise
+ :members:
\ No newline at end of file
diff --git a/docs/stdnum.fr.rcs.rst b/docs/stdnum.fr.rcs.rst
new file mode 100644
index 0000000..a77f27b
--- /dev/null
+++ b/docs/stdnum.fr.rcs.rst
@@ -0,0 +1,5 @@
+stdnum.fr.rcs
+=============
+
+.. automodule:: stdnum.fr.rcs
+ :members:
\ No newline at end of file
diff --git a/docs/stdnum.mz.nuit.rst b/docs/stdnum.mz.nuit.rst
new file mode 100644
index 0000000..8fd5d05
--- /dev/null
+++ b/docs/stdnum.mz.nuit.rst
@@ -0,0 +1,5 @@
+stdnum.mz.nuit
+==============
+
+.. automodule:: stdnum.mz.nuit
+ :members:
\ No newline at end of file
diff --git a/docs/stdnum.sn.ninea.rst b/docs/stdnum.sn.ninea.rst
new file mode 100644
index 0000000..087fd3b
--- /dev/null
+++ b/docs/stdnum.sn.ninea.rst
@@ -0,0 +1,5 @@
+stdnum.sn.ninea
+===============
+
+.. automodule:: stdnum.sn.ninea
+ :members:
\ No newline at end of file
diff --git a/stdnum/__init__.py b/stdnum/__init__.py
index de70ddc..fc5e06a 100644
--- a/stdnum/__init__.py
+++ b/stdnum/__init__.py
@@ -1,7 +1,7 @@
# __init__.py - main module
# coding: utf-8
#
-# Copyright (C) 2010-2025 Arthur de Jong
+# Copyright (C) 2010-2026 Arthur de Jong
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -45,4 +45,4 @@ from stdnum.util import get_cc_module
__all__ = ('get_cc_module', '__version__')
# the version number of the library
-__version__ = '2.1'
+__version__ = '2.2'
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 237 +++++++++++++++++++++++++++++++++++++++++++++
NEWS | 35 +++++++
README.md | 10 +-
docs/conf.py | 2 +-
docs/index.rst | 8 ++
docs/stdnum.az.voen.rst | 5 +
docs/stdnum.be.ogm_vcs.rst | 5 +
docs/stdnum.de.leitweg.rst | 5 +
docs/stdnum.eu.excise.rst | 5 +
docs/stdnum.fr.accise.rst | 5 +
docs/stdnum.fr.rcs.rst | 5 +
docs/stdnum.mz.nuit.rst | 5 +
docs/stdnum.sn.ninea.rst | 5 +
stdnum/__init__.py | 4 +-
14 files changed, 332 insertions(+), 4 deletions(-)
create mode 100644 docs/stdnum.az.voen.rst
create mode 100644 docs/stdnum.be.ogm_vcs.rst
create mode 100644 docs/stdnum.de.leitweg.rst
create mode 100644 docs/stdnum.eu.excise.rst
create mode 100644 docs/stdnum.fr.accise.rst
create mode 100644 docs/stdnum.fr.rcs.rst
create mode 100644 docs/stdnum.mz.nuit.rst
create mode 100644 docs/stdnum.sn.ninea.rst
hooks/post-receive
--
python-stdnum
- python-stdnum branch master updated. 2.2,
Commits of the python-stdnum project