Number to Words Conversion for OnlyOffice
Hey everyone,
I needed a function to convert numbers into words for invoices using the Algerian Dinar, so I developed this script with the help of ChatGPT. Since it might be useful for others, I’m sharing it here as my small contribution.
Demonstration:
This function:
Converts numbers to words in French
Supports large numbers (up to billions)
Adds “Dinar(s) & Centime(s)” for currency formatting
Works smoothly in OnlyOffice
Feel free to use and improve it! Hope it helps someone.
(function() {
/**
* Convertit un nombre en lettres avec la devise "dinar".
* Compatible avec OnlyOffice.
* Auteur: (ChatGPT)
* @customfunction
* @param {number} Nb Le nombre à convertir.
* @returns {string} Le nombre en lettres avec la devise.
*/
function nombreEnLettres(Nb) {
let Chiffre = ["", "Un", "Deux", "Trois", "Quatre", "Cinq", "Six", "Sept", "Huit", "Neuf", "Dix", "Onze", "Douze", "Treize", "Quatorze", "Quinze", "Seize", "Dix-Sept", "Dix-Huit", "Dix-Neuf"];
let dizaine = ["", "Dix", "Vingt", "Trente", "Quarante", "Cinquante", "Soixante", "", "Quatre-Vingt"];
let resultat = "";
let Devise = "Dinar";
if (Nb === 0) return "Zéro " + Devise;
// 🔥 FIX: Ensure proper rounding to avoid floating-point errors
Nb = parseFloat(Nb.toFixed(2));
function centaineDizaine(num) {
let varlet = "";
if (num >= 100) {
varlet += (num >= 200 ? Chiffre[Math.floor(num / 100)] + " Cent " : "Cent ");
num %= 100;
}
if (num < 20) {
varlet += Chiffre[num];
} else {
let varnumD = Math.floor(num / 10);
let varnumU = num % 10;
if (varnumD === 7 || varnumD === 9) {
varlet += dizaine[varnumD - 1] + "-" + Chiffre[varnumU + 10];
} else {
varlet += dizaine[varnumD] + (varnumU ? "-" + Chiffre[varnumU] : "");
}
}
return varlet.trim();
}
let entier = Math.floor(Nb);
let centimes = Math.round((Nb - entier) * 100);
let milliards = Math.floor(entier / 1000000000);
if (milliards > 0) {
resultat += centaineDizaine(milliards) + " Milliard" + (milliards > 1 ? "s " : " ");
}
let millions = Math.floor((entier % 1000000000) / 1000000);
if (millions > 0) {
resultat += centaineDizaine(millions) + " Million" + (millions > 1 ? "s " : " ");
}
let milliers = Math.floor((entier % 1000000) / 1000);
if (milliers > 0) {
resultat += (milliers > 1 ? centaineDizaine(milliers) + " " : "") + "Mille ";
}
let reste = entier % 1000;
if (reste > 0) {
resultat += centaineDizaine(reste) + " ";
}
resultat = resultat.trim() + " " + Devise + (entier > 1 ? "s" : "");
if (centimes > 0) {
resultat += " & " + centaineDizaine(centimes) + " Centime" + (centimes > 1 ? "s" : "");
}
return resultat;
}
Api.AddCustomFunction(nombreEnLettres);
})();
Note:
The script works fine, but when exporting to PDF, a #NAME?
error appears as if the function never existed.
Possible reasons:
- Custom functions are not recalculated during export.
- The function is missing in the exporting process.
Workaround – Convert to Values Before Exporting:
- Select the column where your function is applied.
- Copy (Ctrl + C).
- Paste as values (Ctrl + Shift + V or use “Paste Special” → “Values Only”) in the same cells. (This removes the custom function but keeps the calculated values.)
- Export the sheet to PDF.