NumSpeaks 3.3.0

dotnet add package NumSpeaks --version 3.3.0
                    
NuGet\Install-Package NumSpeaks -Version 3.3.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="NumSpeaks" Version="3.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="NumSpeaks" Version="3.3.0" />
                    
Directory.Packages.props
<PackageReference Include="NumSpeaks" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add NumSpeaks --version 3.3.0
                    
#r "nuget: NumSpeaks, 3.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package NumSpeaks@3.3.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=NumSpeaks&version=3.3.0
                    
Install as a Cake Addin
#tool nuget:?package=NumSpeaks&version=3.3.0
                    
Install as a Cake Tool

NumSpeaks - Number to Words Converter

A .NET library to convert numbers into words in English, Arabic, and Kurdish (Sorani), with proper currency support for 155+ ISO 4217 currencies — correct sub-units, English pluralization, and standard Arabic number-noun agreement (including gender).

What's new in 3.3.0

  • Correct sub-units — cents/fils are computed from the amount and each currency's sub-unit size, not the raw digits after the decimal point. 3.8 now reads "eighty cents" (not "eight"), and a high-precision value like 3.8400000000 no longer becomes "… billion cents".
  • decimals override — optionally set the sub-unit precision per call (e.g. decimals: 0 to suppress fils).
  • English pluralization — "three US dollars", "one US dollar and one cent".
  • Standard Arabic agreement (العدد والمعدود) — dual, plural (incl. broken plurals دنانير/دراهم), and gender: "ثلاث ليرات" (feminine) vs "ثلاثة دولارات" (masculine).
  • Digit-by-digit bare decimals3.074 → "three point zero seven four", distinct from 3.74.
  • Zero-decimal currencies (yen, ISK, CFA francs…) print with no sub-unit and round to the whole unit.

Features

  • Convert numbers to words in English, Arabic, and Kurdish.
  • Decimal amounts, with currency-aware sub-units.
  • 155+ currencies via a type-safe CurrencyCode enum — no string typos.
  • Each currency can be referenced by ISO code or descriptive name.
  • Standard financial wording (unit + sub-unit), pluralized in English; Arabic number-noun agreement with gender for currencies that carry grammatical data.

Installation

dotnet add package NumSpeaks

Usage

Basic Number to Words

using NumSpeaks;

// English
var english = 123_456_789.ToEnglishWords();
// one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine

// Kurdish
var kurdish = 991_887_766_551.ToKurdishWords();
// نۆ سەد و نۆوەت و یەک ملیار و هەشت سەد و هەشتا و حەوت ملیۆن و حەوت سەد و شەست و شەش هەزار و پێنج سەد و پەنجا و یەک

Decimal Numbers (no currency) — read digit by digit

// English
(123.33m).ToEnglishWords();   // one hundred twenty-three point three three
(3.074m).ToEnglishWords();    // three point zero seven four
(3.74m).ToEnglishWords();     // three point seven four   (distinct from 3.074)

// Kurdish
(123.33m).ToKurdishWords();   // سەد و بیست و سێ پۆینت سێ سێ

// Arabic
(123.33m).ToArabicWords();    // مئة و ثلاثة و عشرون فاصل ثلاثة ثلاثة

Currency Support (Type-Safe)

Use either the ISO code or the descriptive name — both are equivalent:

// By ISO code
var usd = (234.32m).ToEnglishWords(CurrencyCode.USD);
// two hundred thirty-four US dollars and thirty-two cents

// By descriptive name (same result)
var usd2 = (234.32m).ToEnglishWords(CurrencyCode.UnitedStatesDollar);
// two hundred thirty-four US dollars and thirty-two cents

Currency in All Languages

// English with Iraqi Dinar (fils = 3 sub-unit digits)
(1500.750m).ToEnglishWords(CurrencyCode.IQD);
// one thousand five hundred Iraqi dinars and seven hundred fifty fils

// English with Turkish Lira
(250.99m).ToEnglishWords(CurrencyCode.TurkishLira);
// two hundred fifty Turkish liras and ninety-nine kurus

// Kurdish with Euro
(50.25m).ToKurdishWords(CurrencyCode.Euro);
// پەنجا یۆرۆ و بیست و پێنج سەنت

// Whole number with currency (pluralized in English)
(1000).ToEnglishWords(CurrencyCode.BritishPound);
// one thousand British pounds

Override the sub-unit precision

By default the sub-unit follows the currency (2 for USD, 3 for IQD, 0 for JPY). Pass decimals to override it:

(1500.75m).ToEnglishWords(CurrencyCode.IQD, decimals: 0);
// one thousand five hundred one Iraqi dinars   (no fils)

Arabic — standard number-noun agreement, including gender

The numeral agrees with the counted noun (العدد والمعدود): 1 → singular, 2 → dual, 3–10 → plural, 11+ → singular; and 3–10 take the opposite-gender numeral (مخالفة):

(3m).ToArabicWords(CurrencyCode.USD);    // ثلاثة دولارات أمريكية   (masculine noun)
(3m).ToArabicWords(CurrencyCode.SYP);    // ثلاث ليرات سورية         (feminine noun: ثلاث, not ثلاثة)
(99.50m).ToArabicWords(CurrencyCode.SAR);// تسعة و تسعون ريال سعودي و خمسون هللة

Supported Currencies

All 155 ISO 4217 currencies are supported. Each can be referenced by code or name:

ISO Code Descriptive Name English Kurdish Arabic
USD UnitedStatesDollar US dollar دۆلاری ئەمریکی دولار أمريكي
EUR Euro euro یۆرۆ يورو
GBP BritishPound British pound پاوەندی بەریتانی جنيه إسترليني
IQD IraqiDinar Iraqi dinar دیناری عێراقی دينار عراقي
TRY TurkishLira Turkish lira لیرەی تورکی ليرة تركية
SAR SaudiRiyal Saudi riyal ریاڵی سعوودی ريال سعودي
AED UnitedArabEmiratesDirham UAE dirham دیرهەمی ئیماراتی درهم إماراتي
KWD KuwaitiDinar Kuwaiti dinar دیناری کوەیتی دينار كويتي
JPY JapaneseYen Japanese yen یەنی ژاپۆنی ين ياباني
CNY ChineseYuan Chinese yuan یوانی چینی يوان صيني
... ... ... ... ...

And 145+ more currencies with full support.

API Reference

// Extension methods on any numeric value.
// currencyCode: omit for a plain number; supply to format as money (unit + sub-unit).
// decimals:     optional precision override; defaults to the currency's natural sub-unit.
public static string ToEnglishWords(this object value, CurrencyCode? currencyCode = null, int? decimals = null);
public static string ToArabicWords (this object value, CurrencyCode? currencyCode = null, int? decimals = null);
public static string ToKurdishWords(this object value, CurrencyCode? currencyCode = null, int? decimals = null);

English pluralization and Arabic number-noun agreement are applied for the currencies that carry grammatical data (USD, IQD, SAR, AED, KWD, QAR, GBP, EGP, JOD, BHD, LYD, YER, SYP, …); any other currency falls back to a safe singular form.

Feedback

If you encounter issues or have suggestions, please open an issue on the GitHub repository.

License

This project is licensed under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.3.0 99 6/1/2026
3.2.1 97 5/17/2026
3.2.0 78 5/17/2026
3.1.3 99 5/17/2026
3.1.2 91 5/17/2026
3.1.1 114 3/29/2026
3.1.0 111 3/18/2026
3.0.0 107 3/17/2026
2.1.2 280 2/14/2024
2.1.1 204 2/14/2024
2.1.0 211 2/11/2024
2.0.1 218 2/8/2024
2.0.0 185 2/8/2024
1.0.1 252 1/8/2024
1.0.0.1 209 1/8/2024
1.0.0 235 1/8/2024

3.3.0 — Currency sub-units (cents/fils) are now derived from the amount and each currency's SubUnitFactor, instead of the raw digits after the decimal point. Fixes sub-unit output that depended on decimal scale (e.g. 3.8 now reads "eighty cents", not "eight"; 3.8400000000 no longer becomes "... billion cents"), supports 1000-based dinar fils and no-sub-unit currencies (JPY/KRW), and avoids a culture-dependent parse. Whole numbers and clean 2-decimal amounts are unchanged. Adds an optional 'decimals' parameter to ToEnglishWords/ToArabicWords/ToKurdishWords that overrides the sub-unit precision per call (e.g. decimals: 0 to suppress fils); it defaults to the currency's natural sub-unit, so existing calls are unaffected. Bare numbers (no currency) with a fraction are now read digit-by-digit after the decimal word (e.g. 3.074 -> "three point zero seven four", distinct from 3.74), preserving place value; previously the fractional digits were read as one number, which dropped leading zeros and made 3.074 and 3.74 read the same. English currency words are now pluralized by count ("three US dollars", "one US dollar and one cent"; yen/won invariant, pence/penny); Kurdish keeps the singular noun after a numeral (grammatically correct) and Arabic is unchanged (proper dual/plural grammar is a separate task). No-sub-unit currencies (yen plus other 0-decimal currencies — ISK, CLP, UGX, the CFA francs, etc., now flagged with SubUnitFactor = 1) round to the nearest whole unit. Arabic currency words now follow standard number-noun agreement (1 singular, 2 dual, 3-10 plural, 11+ singular) for currencies with dual/plural forms supplied (USD, IQD, SAR, AED, KWD, QAR, GBP, EGP, JOD, BHD, LYD, YER); the numeral follows the noun for one ("دولار واحد") and eleven uses the masculine "أحد عشر". Gender agreement (مخالفة) is applied for feminine nouns too (ثلاث ليرات vs ثلاثة دولارات, واحدة, إحدى عشرة) via per-currency gender flags, with a full gender-aware cardinal speller (hundreds مئتان/خمسمائة, thousands آلاف); SYP and the Saudi halala sub-unit are populated as feminine. Other currencies fall back to the singular.