XOF n'a pas de centimes — le bug qui m'a coûté 3h

2 min read29 avril 2026#moneroo#xof#devises#bug#afrique

XOF n'a pas de centimes — le bug qui m'a coûté 3h

Quand tu travailles avec des APIs de paiement européennes ou américaines, les montants s'envoient en centimes.

5 € → tu envoies 500. Un café à 1,50 € → tu envoies 150.

C'est une convention pour éviter les flottants dans les calculs financiers.

Le problème : j'avais pris cette habitude. Et quand j'ai intégré Moneroo pour la première fois, j'ai fait pareil.

5 000 FCFA → j'ai envoyé 500000.

Résultat : le lien de paiement affichait 500 000 FCFA. Pas 5 000.


Le XOF — et plusieurs devises africaines — n'ont pas de subdivision en centimes. 5 000 FCFA c'est 5 000. Pas 50 FCFA. Pas 500 000 FCFA. 5 000.

Les devises concernées : XOF, XAF, GNF, CDF.

Depuis, j'ai une fonction dans tous mes projets Moneroo :

const NO_SUBUNIT = ["XOF", "XAF", "GNF", "CDF"];
 
function toMonerooAmount(amount: number, currency: string): number {
  return NO_SUBUNIT.includes(currency) ? amount : Math.round(amount / 100);
}
 
function formatPrice(amount: number, currency = "XOF"): string {
  return new Intl.NumberFormat("fr-FR", {
    style: "currency",
    currency,
    minimumFractionDigits: 0,
  }).format(amount);
}
// formatPrice(5000, "XOF") → "5 000 FCFA"

Si la devise est dans NO_SUBUNIT, le montant que tu as en base est déjà le bon. Tu n'as rien à diviser.

Mémo : XOF ne divise jamais.