Technique

Erreur décimal Factur-X : virgule au lieu de point — règle XML + décimales par champ

2 min de lecture Par FacturX API

Les montants, taux et quantités Factur-X utilisent le point comme séparateur décimal. Les contraintes de décimales varient : 2 pour de nombreux montants, davantage pour les quantités.

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_FR avant 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]"

Voir aussi

#en16931 #schematron #factur-x #erreurs #validation