NumSpeaks 3.3.0
dotnet add package NumSpeaks --version 3.3.0
NuGet\Install-Package NumSpeaks -Version 3.3.0
<PackageReference Include="NumSpeaks" Version="3.3.0" />
<PackageVersion Include="NumSpeaks" Version="3.3.0" />
<PackageReference Include="NumSpeaks" />
paket add NumSpeaks --version 3.3.0
#r "nuget: NumSpeaks, 3.3.0"
#:package NumSpeaks@3.3.0
#addin nuget:?package=NumSpeaks&version=3.3.0
#tool nuget:?package=NumSpeaks&version=3.3.0
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.8now reads "eighty cents" (not "eight"), and a high-precision value like3.8400000000no longer becomes "… billion cents". decimalsoverride — optionally set the sub-unit precision per call (e.g.decimals: 0to 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 decimals —
3.074→ "three point zero seven four", distinct from3.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
CurrencyCodeenum — 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 | Versions 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. |
-
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.