En bref
- Tous les nombres décimaux en XML Factur-X utilisent le point
.comme séparateur, jamais la virgule,. - Règle XML/XSD universelle (
xs:decimal), indépendante de la locale système. - Erreur typique en Europe francophone : ERP qui formate selon la locale
fr_FRavant l’export. - Les contraintes de nombre de décimales dépendent du champ : de nombreux montants sont limités à 2 décimales, les quantités peuvent en avoir davantage.
- Réparable automatiquement par
/repair(regex de normalisation).
Ce que l’erreur veut dire
La spécification XML Schema (XSD) impose le point comme séparateur décimal pour les types xs:decimal, xs:double, xs:float. Les montants, taux et quantités Factur-X sont sérialisés comme valeurs décimales XML avec un point . comme séparateur. En revanche, les contraintes de nombre de décimales ne sont pas identiques selon les champs : beaucoup de montants sont limités à 2 décimales, alors que les quantités peuvent en avoir davantage. Une virgule rend la valeur invalide au niveau XSD avant même Schematron.
Quand cette erreur arrive
Très fréquent en : (a) France et pays francophones où la locale système formate les décimaux avec , ; (b) export depuis Excel sans nettoyage de format ; (c) sérialisation Java/PHP/Python qui respecte la locale au lieu d’utiliser Locale.ROOT ; (d) traitement post-export (recherche/remplace humain) qui ré-introduit les virgules.
Exemple XML qui déclenche l’erreur
<ram:GrandTotalAmount>1 200,00</ram:GrandTotalAmount> <!-- ❌ espace + virgule -->
<ram:RateApplicablePercent>20,00</ram:RateApplicablePercent> <!-- ❌ virgule -->
Exemple XML corrigé
<ram:GrandTotalAmount>1200.00</ram:GrandTotalAmount>
<ram:RateApplicablePercent>20.00</ram:RateApplicablePercent>
Correction manuelle
Forcer la locale à C/POSIX/ROOT lors de la sérialisation XML : Java String.format(Locale.ROOT, "%.2f", v), Python f"{v:.2f}", PHP number_format($v, 2, '.', ''). Aucun séparateur de milliers. Le nombre de décimales dépend du champ : vérifiez les contraintes spécifiques (montants généralement 2, quantités pouvant être davantage).
Réparable automatiquement par /repair ?
Oui — l’endpoint /repair corrige automatiquement cette erreur dans la majorité des cas.
Et maintenant ?
Réparer mon Factur-X →
curl -X POST https://api.facturxapi.com/api/v1/repair \
-H "Authorization: Bearer VOTRE_CLE" \
-F "[email protected]"