3mdikram / worldmoneywords
Multilingual amount-to-words and money-to-text converter with English, Hindi, Arabic, and more through custom language packs for PHP and Laravel invoices, cheques, receipts, and payments, plus 200-country ISO support and packages for Python, Go, Java, React, TypeScript, browsers, and Node.js.
Requires
- php: ^8.1
- ext-intl: *
- league/iso3166: ^4.3
- symfony/intl: ^6.4
Requires (Dev)
- phpunit/phpunit: ^10.5 || ^11.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
🌍 WorldMoneyWords
Turn currency amounts into clear, document-ready words for invoices, cheques, receipts, payments, and banking workflows.
One consistent API for PHP, Laravel, Python, Go, Java, Android/Kotlin, React, TypeScript, browsers, and Node.js—with ISO country codes, global currencies, multilingual output, and customizable financial wording.
📚 Index · 🚀 Quick start · 📦 Packages · 🧩 API · 🌐 Countries · 🛠️ Advanced
| Amount | Country | Currency | Result |
|---|---|---|---|
1234.50 |
IND |
INR |
One Thousand Two Hundred Thirty Four Rupees and Fifty Paise Only |
WorldMoneyWords is a multilingual amount-to-words library with English, Hindi, Arabic, and more through custom language packs for PHP, Laravel, Python, Go, Java, Android/Kotlin, React, TypeScript, browsers, and Node.js. Give it an amount, an ISO country code, and an ISO currency code; it returns correctly formatted wording with the appropriate major and minor currency units.
Use it as an amount to words, amount to text, money to words, money to text, number to words, number to text, or currency to words converter. It is designed for cheque amounts, invoices, receipts, payment confirmations, banking forms, and other financial documents.
Common searches and use cases include amount in words, amount converter, number converter, money converter, currency converter, spell amount, spell number, cheque writing, check writing, multi-currency, and international currency formatting.
It supports 200 important countries, ISO 3166-1 Alpha-2 and Alpha-3 country codes, ISO 4217 currency codes, exact decimal-string handling in PHP, negative values, configurable wording, and singular/plural grammar.
Choose English, Hindi, or Arabic explicitly, register reviewed language packs, or safely fall back to English when a writer is unavailable. Output can include full currency names such as US Dollars or short names such as Dollars, with control over the Only suffix, zero minor units, and conjunction wording.
WorldMoneyWords also supports custom currencies, batch conversion, structured results, case-insensitive codes, formatted numeric input, and consistent options across every runtime. Country validation and output-language selection remain independent, so the supplied country code never silently changes the requested language.
The same predictable API shape is available on every supported platform:
convert(amount, countryCode, currencyCode, options?)
📚 Documentation index
| Area | Documentation |
|---|---|
| Platform guides | PHP · Laravel · Python · Go · Java · Android / Kotlin · React / TypeScript / Node.js |
| Installation and examples | All packages and platform examples |
| API reference | Core API · Conversion options · Advanced PHP usage |
| International support | Official-language packs · Country and currency list |
| Project resources | Requirements · Development · Contributing · License |
🗣️ Official-language packs
WorldMoneyWords provides consistent native amount wording in English (en), Hindi (hi), and Arabic (ar) across every supported platform.
A language pack is responsible for the complete financial wording of a language:
- Cardinal-number grammar, including large-number scales
- Major currency names and singular/plural forms
- Minor currency-unit wording
- Negative, conjunction, and final-suffix labels
- Native script and language-specific punctuation
Note
A country being accepted does not mean its language writer is built in. Country validation and output-language support are separate. An unregistered language code safely falls back to English.
How to add a language
- Implement the platform’s
LanguagePackinterface. - Register the pack with the converter.
- Pass its language code through the normal
languageoption.
| Platform | Extension API |
|---|---|
| PHP / Laravel | Implement LanguagePack, then call $converter->addLanguagePack($pack) |
| Python | Create LanguagePack(...), then call converter.add_language_pack(pack) |
| Go | Create LanguagePack, then call amountwords.RegisterLanguagePack(pack) |
| Java | Implement LanguagePack, then call converter.registerLanguagePack(pack) |
| Android / Kotlin | Register a Java LanguagePack through converter.javaDelegate() |
| React / TypeScript / Node.js | Create LanguagePack, then call registerLanguagePack(pack) |
PHP integration template
use AmountToWords\AmountToWords; use AmountToWords\ConversionOptions; use AmountToWords\LanguagePack; $urdu = new class implements LanguagePack { public function code(): string { return 'ur'; } public function spell(string $number): string { // Supply a tested native number writer. return UrduNumberWriter::spell($number); } public function currencyName(string $code, bool $singular): string { // Return the reviewed Urdu currency name. return UrduCurrencyNames::name($code, $singular); } public function labels(): array { return [ 'minus' => 'منفی', 'conjunction' => 'اور', 'only' => 'صرف', 'minorSingular' => 'ذیلی اکائی', 'minorPlural' => 'ذیلی اکائیاں', ]; } }; $converter = (new AmountToWords())->addLanguagePack($urdu); echo $converter->convert( '1250.50', 'PK', 'PKR', new ConversionOptions(language: 'ur'), ); // Output is produced by the registered Urdu writer.
Important
Only describe a language as supported after its grammar, currency terminology, decimals, negative values, and large-number output have been reviewed and tested. Registering a language code alone is not native-language support.
✨ Why WorldMoneyWords?
| Feature | Description |
|---|---|
| 🌐 Important country support | Accepts ISO 3166-1 Alpha-2 and Alpha-3 codes for 200 important countries |
| 💱 Currency aware | Supports ISO 4217 names, minor units, and 0/2/3 decimal currencies |
| 🎯 Financial accuracy | Exact decimal-string rounding avoids binary floating-point loss in PHP |
| 🔄 Automatic code normalization | Converts Alpha-2 codes such as IN and US to canonical Alpha-3 codes |
| ⚙️ Configurable wording | Control the Only suffix, zero minor units, and conjunction text |
| 🗣️ Multilingual output | Generate amount wording in English (en), Hindi (hi), or Arabic (ar) for every supported country |
| 🎛️ Explicit language selection | Keeps English as the default and changes language only when the caller supplies a language code |
| 🏷️ Short currency names | Produces Alpha-2 country codes with short units such as PK Rupees |
| 🌍 Country-independent language | Uses the requested language without silently changing it from the supplied country code |
| 🧠 Reusable language packs | Adds reviewed number grammar, currency terminology, and local labels through a dedicated interface |
| 🧯 Safe language fallback | Uses English when a requested language writer is unavailable |
| ✅ Validated language extensions | Rejects malformed language tags, missing writers, and empty required labels |
| 🔢 Formatted amount input | Accepts plain values and correctly grouped input such as 1,234,567.89 |
| ➖ Negative amount support | Produces readable wording for refunds, adjustments, and negative balances |
| ✍️ Correct grammar | Handles singular and plural major and minor currency units |
| 🧾 Structured results | Returns JSON-serializable text, country, currency, major amount, and minor amount |
| 📚 Discovery helpers | Lists supported countries and currencies for validation and form controls |
| 🔠 Case insensitive | Accepts country and currency codes in upper or lowercase |
| 🧩 Multi-platform | PHP, Laravel, Python, Go, Java, Android/Kotlin, React, browsers, and Node.js |
| 🔁 Consistent platform options | Provides equivalent language, suffix, minor-unit, conjunction, and short-name controls in every runtime |
| 📦 Batch friendly | Converts multiple monetary values in a single call |
| 🔧 Extensible | Register or override currency names and minor units |
| 🧠 Custom language support | Add native number grammar, currency wording, and local labels for your required languages |
| 🛡️ Clear validation | Provides specific errors for invalid amounts, countries, and currencies |
🚀 Quick start
PHP
composer require 3mdikram/worldmoneywords
<?php use AmountToWords\AmountToWords; $converter = new AmountToWords(); echo $converter->convert('1234.50', 'IND', 'INR'); // One Thousand Two Hundred Thirty Four Rupees and Fifty Paise Only
📦 Platforms
| Platform | Install / package | Main API |
|---|---|---|
| 🐘 PHP | composer require 3mdikram/worldmoneywords |
$converter->convert(...) |
| 🔺 Laravel | composer require 3mdikram/worldmoneywords |
AmountToWords::convert(...) |
| 🐍 Python | pip install worldmoneywords |
converter.convert(...) |
| 🐹 Go | go get github.com/3mdikram/WorldMoneyWords |
amountwords.Convert(...) |
| ☕ Java | io.github.3mdikram:worldmoneywords |
converter.convert(...) |
| 🤖 Android / Kotlin | Unreleased AAR: worldmoneywords-android |
converter.convert(...) |
| ⚛️ React / Node.js | npm install @3mdikram/worldmoneywords |
amountToWords(...) |
🔺 Laravel examples — installation, options, language, and short names
composer require 3mdikram/worldmoneywords
1. Default conversion
use mdikram\Facades\AmountToWords; echo AmountToWords::convert('99.95', 'USA', 'USD'); // Ninety Nine US Dollars and Ninety Five Cents Only
2. Conversion with options
use AmountToWords\ConversionOptions; use mdikram\Facades\AmountToWords; $options = new ConversionOptions( includeOnly: false, includeZeroMinor: true, conjunction: 'plus', ); echo AmountToWords::convert('10.00', 'US', 'USD', $options); // Ten US Dollars plus Zero Cents
3. Conversion with language
use AmountToWords\ConversionOptions; use mdikram\Facades\AmountToWords; $options = new ConversionOptions(language: 'hi'); echo AmountToWords::convert('10', 'IN', 'INR', $options); // दस भारतीय रुपया मात्र
4. Conversion with short currency name
use AmountToWords\ConversionOptions; use mdikram\Facades\AmountToWords; $options = new ConversionOptions( includeOnly: false, includeZeroMinor: true, conjunction: 'plus', shortCurrencyName: true, ); echo AmountToWords::convert('10.00', 'US', 'USD', $options); // Ten US Dollars plus Zero Cents
Laravel discovers the provider and facade automatically from the main package. See the Laravel guide.
🐍 Python examples — installation, options, language, and short names
pip install worldmoneywords
1. Default conversion
from amount_to_words import AmountToWords converter = AmountToWords() print(converter.convert("42.50", "GBR", "GBP")) # Forty Two Pounds and Fifty Pence Only
2. Conversion with options
from amount_to_words import AmountToWords, ConversionOptions options = ConversionOptions( include_only=False, include_zero_minor=True, conjunction="plus", ) print(AmountToWords().convert("10.00", "US", "USD", options)) # Ten US Dollars plus Zero Cents
3. Conversion with language
from amount_to_words import AmountToWords, ConversionOptions options = ConversionOptions(language="hi") print(AmountToWords().convert("10", "IN", "INR", options)) # दस भारतीय रुपया मात्र
4. Conversion with short currency name
from amount_to_words import AmountToWords, ConversionOptions options = ConversionOptions( include_only=False, include_zero_minor=True, conjunction="plus", short_currency_name=True, ) print(AmountToWords().convert("10.00", "US", "USD", options)) # Ten US Dollars plus Zero Cents
🐹 Go examples — installation, options, language, and short names
go get github.com/3mdikram/WorldMoneyWords
1. Default conversion
package main import ( "fmt" amountwords "github.com/3mdikram/WorldMoneyWords" ) func main() { text, err := amountwords.Convert(42.50, "GBR", "GBP") if err != nil { panic(err) } fmt.Println(text) }
2. Conversion with options
options := amountwords.Options{ IncludeOnly: false, IncludeZeroMinor: true, Conjunction: "plus", } text, err := amountwords.Convert(10, "US", "USD", options) if err != nil { panic(err) } fmt.Println(text) // Ten US Dollars plus Zero Cents
3. Conversion with language
options := amountwords.Options{ IncludeOnly: true, Conjunction: "and", Language: "hi", } text, err := amountwords.Convert(10, "IN", "INR", options) if err != nil { panic(err) } fmt.Println(text) // दस भारतीय रुपया मात्र
4. Conversion with short currency name
options := amountwords.Options{ IncludeOnly: false, IncludeZeroMinor: true, Conjunction: "plus", ShortCurrencyName: true, } text, err := amountwords.Convert(10, "US", "USD", options) if err != nil { panic(err) } fmt.Println(text) // Ten US Dollars plus Zero Cents
☕ Java examples — installation, options, language, and short names
cd java
mvn install
1. Default conversion
import io.github.mdikram.worldmoneywords.WorldMoneyWords; WorldMoneyWords converter = new WorldMoneyWords(); String text = converter.convert("42.50", "GB", "GBP"); // Forty Two Pounds and Fifty Pence Only
2. Conversion with options
import io.github.mdikram.worldmoneywords.ConversionOptions; import io.github.mdikram.worldmoneywords.WorldMoneyWords; WorldMoneyWords converter = new WorldMoneyWords(); ConversionOptions options = new ConversionOptions(false, true, "plus"); String text = converter.convert("10.00", "US", "USD", options); // Ten US Dollars plus Zero Cents
3. Conversion with language
import io.github.mdikram.worldmoneywords.ConversionOptions; import io.github.mdikram.worldmoneywords.WorldMoneyWords; WorldMoneyWords converter = new WorldMoneyWords(); ConversionOptions options = new ConversionOptions(true, false, "and", "hi"); String text = converter.convert("10", "IN", "INR", options); // दस भारतीय रुपया मात्र
4. Conversion with short currency name
import io.github.mdikram.worldmoneywords.ConversionOptions; import io.github.mdikram.worldmoneywords.WorldMoneyWords; WorldMoneyWords converter = new WorldMoneyWords(); ConversionOptions options = new ConversionOptions(false, true, "plus", "en", true); String text = converter.convert("10.00", "US", "USD", options); // Ten US Dollars plus Zero Cents
Requires Java 11 or newer. See the Java guide.
🤖 Android / Kotlin examples — exact decimal strings, options, and localization
After release to Maven Central, installation will use:
dependencies {
implementation("io.github.3mdikram:worldmoneywords-android:<released-version>")
}
1. Default conversion
import io.github.mdikram.worldmoneywords.android.AndroidAmountToWords val converter = AndroidAmountToWords() val text = converter.convert("1234.50", "IN", "INR") // One Thousand Two Hundred Thirty Four Rupees and Fifty Paise Only
2. Conversion with Kotlin options
import io.github.mdikram.worldmoneywords.android.AndroidConversionOptions val text = converter.convert( amount = "10.00", countryCode = "US", currencyCode = "USD", options = AndroidConversionOptions( includeOnly = false, includeZeroMinor = true, conjunction = "plus", shortCurrencyName = true, ), ) // Ten US Dollars plus Zero Cents
3. Hindi output
val hindi = converter.convert( amount = "1234.50", countryCode = "IN", currencyCode = "INR", options = AndroidConversionOptions(language = "hi"), ) // एक हज़ार दो सौ चौंतीस भारतीय रुपया और पचास उप-इकाइयाँ मात्र
The Android API intentionally accepts monetary amounts as decimal strings, avoiding accidental Double precision loss. It supports Android API 21 and newer and delegates to the tested Java conversion engine. See the Android guide.
⚛️ React / TypeScript examples — installation, options, language, and short names
npm install @3mdikram/worldmoneywords
1. Default conversion
import { amountToWords } from '@3mdikram/worldmoneywords'; export function PaymentTotal() { const words = amountToWords('1500.25', 'USA', 'USD'); return <p>{words}</p>; }
2. Conversion with options
import { amountToWords } from '@3mdikram/worldmoneywords'; export function CustomPaymentTotal() { const words = amountToWords('10.00', 'US', 'USD', { includeOnly: false, includeZeroMinor: true, conjunction: 'plus', }); return <p>{words}</p>; // Ten US Dollars plus Zero Cents }
3. Conversion with language
import { amountToWords } from '@3mdikram/worldmoneywords'; export function HindiPaymentTotal() { const words = amountToWords('10', 'IN', 'INR', { language: 'hi', }); return <p>{words}</p>; // दस भारतीय रुपया मात्र }
4. Conversion with short currency name
import { amountToWords } from '@3mdikram/worldmoneywords'; export function ShortCurrencyPaymentTotal() { const words = amountToWords('10.00', 'US', 'USD', { includeOnly: false, includeZeroMinor: true, conjunction: 'plus', shortCurrencyName: true, }); return <p>{words}</p>; // Ten US Dollars plus Zero Cents }
The TypeScript package has no React runtime dependency, so it also works in browsers and Node.js.
🧩 Core API
convert(int|float|string $amount, string $countryCode, string $currencyCode, ?ConversionOptions $options = null): string
| Argument | Accepted values | Example | Purpose |
|---|---|---|---|
amount |
Integer, decimal, or numeric string | '1,234.50' |
Amount to convert; strings are recommended for financial precision |
countryCode |
ISO 3166-1 Alpha-2 or Alpha-3 | 'IN' or 'IND' |
Validates and normalizes the country, case-insensitively |
currencyCode |
Three-letter ISO 4217 code | 'INR' |
Selects the major unit, minor unit, and decimal precision |
options |
ConversionOptions or platform equivalent |
new ConversionOptions(shortCurrencyName: true) |
Controls suffixes, minor units, conjunctions, currency naming, and output language |
Conversion options
| Option | Type | Default | What it does | Example result |
|---|---|---|---|---|
includeOnly |
boolean |
true |
Adds Only to the end of the amount |
Ten US Dollars Only |
includeZeroMinor |
boolean |
false |
Includes the minor unit when its value is zero | Ten US Dollars and Zero Cents Only |
conjunction |
string |
and |
Changes the word joining major and minor units | Ten US Dollars plus Fifty Cents Only |
language |
string |
en |
Uses English by default. Pass hi, ar, or a registered language code to request that output explicitly |
एक हज़ार भारतीय रुपया मात्र |
shortCurrencyName |
boolean |
false |
Uses the Alpha-2 country code with the short currency unit | Ten PK Rupees Only |
ignoreCountryName |
boolean |
false |
Explicitly removes the country qualifier from bundled currency names | Ten Rupees Only |
Use the options when you need wording tailored to invoices, cheques, banking forms, or local document rules:
- Keep the defaults for standard financial wording.
- Set
includeOnlytofalsewhen a document does not require anOnlysuffix. - Set
includeZeroMinortotruewhen zero cents, paise, or fils must be stated explicitly. - Change
conjunctionto wording such aspluswhen required by your output format. - In PHP/Laravel, set
shortCurrencyNametotrueto use the Alpha-2 country code plus the short unit, such asPK Rupees. - Set
ignoreCountryNametotruewhen you explicitly wantRupeesinstead ofPakistani Rupees; it uses the same bundled short-name rules.
Option names follow each language's normal style:
| Option | PHP / TypeScript | Python | Go | Java / Android Kotlin |
|---|---|---|---|---|
| Only suffix | includeOnly |
include_only |
IncludeOnly |
includeOnly |
| Zero minor unit | includeZeroMinor |
include_zero_minor |
IncludeZeroMinor |
includeZeroMinor |
| Conjunction | conjunction |
conjunction |
Conjunction |
conjunction |
| Output language | language |
language |
Language |
language |
| Short currency name | shortCurrencyName |
short_currency_name |
ShortCurrencyName |
shortCurrencyName |
| Ignore country qualifier | ignoreCountryName |
ignore_country_name |
IgnoreCountryName |
ignoreCountryName |
Short currency name
$options = new ConversionOptions( includeOnly: false, includeZeroMinor: true, conjunction: 'plus', shortCurrencyName: true, ); echo $converter->convert('10.00', 'US', 'USD', $options); // Ten US Dollars plus Zero Cents
Hindi and English output
$hindi = $converter->convert('1234.50', 'IN', 'INR', new ConversionOptions(language: 'hi')); // एक हज़ार दो सौ चौंतीस भारतीय रुपया और पचास उप-इकाई मात्र $english = $converter->convert('1234.50', 'US', 'USD', new ConversionOptions(language: 'en')); // One Thousand Two Hundred Thirty Four US Dollars and Fifty Cents Only
Language selection changes only the generated wording. ISO Alpha-2/Alpha-3 country validation remains available for all 200 supported countries.
Language selection is explicit. Omitting language always keeps the default English output, regardless of the country code. Pass a built-in or registered language code to request different wording. An unsupported code such as ur falls back to English until that writer is registered.
// No language option: always English. echo $converter->convert('10', 'IN', 'INR'); // Ten Rupees Only // Explicit language option: convert using the requested writer. echo $converter->convert( '10', 'IN', 'INR', new ConversionOptions(language: 'hi'), ); // दस भारतीय रुपया मात्र
Invalid PHP input throws a specific exception from AmountToWords\Exception.
🛠️ Advanced PHP usage
Customize the sentence
use AmountToWords\ConversionOptions; $options = new ConversionOptions( includeOnly: false, includeZeroMinor: true, conjunction: 'plus', ); echo $converter->convert('10.00', 'USA', 'USD', $options); // Ten US Dollars plus Zero Cents
The same optional fourth argument is available in every native implementation:
from amount_to_words import AmountToWords, ConversionOptions options = ConversionOptions(include_only=False, include_zero_minor=True, conjunction="plus") text = AmountToWords().convert("10.00", "US", "USD", options)
options := amountwords.Options{ IncludeOnly: false, IncludeZeroMinor: true, Conjunction: "plus", } text, err := amountwords.Convert(10, "US", "USD", options)
const text = amountToWords('10.00', 'US', 'USD', { includeOnly: false, includeZeroMinor: true, conjunction: 'plus', });
ConversionOptions options = new ConversionOptions(false, true, "plus"); String text = new WorldMoneyWords().convert("10.00", "US", "USD", options);
Return structured API data
$result = $converter->convertDetailed('12.05', 'IND', 'INR'); echo json_encode($result, JSON_PRETTY_PRINT);
{
"text": "Twelve Rupees and Five Paise Only",
"countryCode": "IND",
"currencyCode": "INR",
"majorAmount": "12",
"minorAmount": "05"
}
Convert several amounts
$results = $converter->convertMany([ ['amount' => '1.00', 'country' => 'USA', 'currency' => 'USD'], ['amount' => '2.00', 'country' => 'GBR', 'currency' => 'GBP'], ]);
Add a custom currency
use AmountToWords\Currency; $converter = $converter->addCurrency( 'XTS', new Currency('Token', 'Tokens', 'Bit', 'Bits', 2), );
Handle exact financial values
$converter->convert('9007199254740993.49', 'USA', 'USD'); $converter->convert('1.999', 'USA', 'USD'); // Two US Dollars Only
WorldMoneyWords performs decimal-string rounding in PHP, including correct carry behavior and negative-zero handling.
🌍 Country and currency support
| Country | Alpha-2 | Alpha-3 | Currency | ISO currency | Primary language | |
|---|---|---|---|---|---|---|
| 🇮🇳 | India | IN |
IND |
Indian Rupee | INR |
HI |
| 🇺🇸 | United States | US |
USA |
US Dollar | USD |
EN |
| 🇬🇧 | United Kingdom | GB |
GBR |
Pound Sterling | GBP |
EN |
| 🇦🇪 | United Arab Emirates | AE |
ARE |
UAE Dirham | AED |
AR |
| 🇨🇦 | Canada | CA |
CAN |
Canadian Dollar | CAD |
EN |
| 🇦🇺 | Australia | AU |
AUS |
Australian Dollar | AUD |
EN |
| 🇩🇪 | Germany | DE |
DEU |
Euro | EUR |
DE |
| 🇫🇷 | France | FR |
FRA |
Euro | EUR |
FR |
| 🇯🇵 | Japan | JP |
JPN |
Japanese Yen | JPY |
JA |
| 🇨🇳 | China | CN |
CHN |
Yuan | CNY |
ZH |
| 🇸🇬 | Singapore | SG |
SGP |
Singapore Dollar | SGD |
EN |
| 🇸🇦 | Saudi Arabia | SA |
SAU |
Saudi Riyal | SAR |
AR |
| 🇧🇷 | Brazil | BR |
BRA |
Brazilian Real | BRL |
PT |
| 🇿🇦 | South Africa | ZA |
ZAF |
Rand | ZAR |
EN |
| 🇳🇿 | New Zealand | NZ |
NZL |
New Zealand Dollar | NZD |
EN |
🌐 Browse all other 185 supported countries
| Country | Alpha-2 | Alpha-3 | Currency | ISO currency | Primary language | |
|---|---|---|---|---|---|---|
| 🇦🇫 | Afghanistan | AF |
AFG |
Afghan Afghani | AFN |
FA |
| 🇦🇱 | Albania | AL |
ALB |
Albanian Lek | ALL |
SQ |
| 🇩🇿 | Algeria | DZ |
DZA |
Algerian Dinar | DZD |
AR |
| 🇦🇩 | Andorra | AD |
AND |
Euro | EUR |
CA |
| 🇦🇴 | Angola | AO |
AGO |
Angolan Kwanza | AOA |
PT |
| 🇦🇬 | Antigua and Barbuda | AG |
ATG |
East Caribbean Dollar | XCD |
EN |
| 🇦🇷 | Argentina | AR |
ARG |
Argentine Peso | ARS |
ES |
| 🇦🇲 | Armenia | AM |
ARM |
Armenian Dram | AMD |
HY |
| 🇦🇹 | Austria | AT |
AUT |
Euro | EUR |
DE |
| 🇦🇿 | Azerbaijan | AZ |
AZE |
Azerbaijani Manat | AZN |
AZ |
| 🇧🇸 | Bahamas | BS |
BHS |
Bahamian Dollar | BSD |
EN |
| 🇧🇭 | Bahrain | BH |
BHR |
Bahraini Dinar | BHD |
AR |
| 🇧🇩 | Bangladesh | BD |
BGD |
Bangladeshi Taka | BDT |
BN |
| 🇧🇧 | Barbados | BB |
BRB |
Barbadian Dollar | BBD |
EN |
| 🇧🇾 | Belarus | BY |
BLR |
Belarusian Ruble | BYN |
BE |
| 🇧🇪 | Belgium | BE |
BEL |
Euro | EUR |
NL |
| 🇧🇿 | Belize | BZ |
BLZ |
Belize Dollar | BZD |
EN |
| 🇧🇯 | Benin | BJ |
BEN |
West African CFA Franc | XOF |
FR |
| 🇧🇹 | Bhutan | BT |
BTN |
Bhutanese Ngultrum, Indian Rupee | BTN, INR |
DZ |
| 🇧🇴 | Bolivia (Plurinational State of) | BO |
BOL |
Bolivian Boliviano | BOB |
ES |
| 🇧🇦 | Bosnia and Herzegovina | BA |
BIH |
Bosnia-Herzegovina Convertible Mark | BAM |
BS |
| 🇧🇼 | Botswana | BW |
BWA |
Botswanan Pula | BWP |
EN |
| 🇧🇳 | Brunei Darussalam | BN |
BRN |
Brunei Dollar | BND |
MS |
| 🇧🇬 | Bulgaria | BG |
BGR |
Euro | EUR |
BG |
| 🇧🇫 | Burkina Faso | BF |
BFA |
West African CFA Franc | XOF |
FR |
| 🇧🇮 | Burundi | BI |
BDI |
Burundian Franc | BIF |
RN |
| 🇨🇻 | Cabo Verde | CV |
CPV |
Cape Verdean Escudo | CVE |
PT |
| 🇰🇭 | Cambodia | KH |
KHM |
Cambodian Riel | KHR |
KM |
| 🇨🇲 | Cameroon | CM |
CMR |
Central African CFA Franc | XAF |
FR |
| 🇨🇫 | Central African Republic | CF |
CAF |
Central African CFA Franc | XAF |
SG |
| 🇹🇩 | Chad | TD |
TCD |
Central African CFA Franc | XAF |
AR |
| 🇨🇱 | Chile | CL |
CHL |
Chilean Peso | CLP |
ES |
| 🇨🇴 | Colombia | CO |
COL |
Colombian Peso | COP |
ES |
| 🇰🇲 | Comoros | KM |
COM |
Comorian Franc | KMF |
AR |
| 🇨🇬 | Congo | CG |
COG |
Central African CFA Franc | XAF |
FR |
| 🇨🇩 | Congo (Democratic Republic of the) | CD |
COD |
Congolese Franc | CDF |
FR |
| 🇨🇷 | Costa Rica | CR |
CRI |
Costa Rican Colón | CRC |
ES |
| 🇨🇮 | Côte d'Ivoire | CI |
CIV |
West African CFA Franc | XOF |
FR |
| 🇭🇷 | Croatia | HR |
HRV |
Euro | EUR |
HR |
| 🇨🇺 | Cuba | CU |
CUB |
Cuban Peso | CUP |
ES |
| 🇨🇾 | Cyprus | CY |
CYP |
Euro | EUR |
EL |
| 🇨🇿 | Czechia | CZ |
CZE |
Czech Koruna | CZK |
CS |
| 🇩🇰 | Denmark | DK |
DNK |
Danish Krone | DKK |
DA |
| 🇩🇯 | Djibouti | DJ |
DJI |
Djiboutian Franc | DJF |
FR |
| 🇩🇲 | Dominica | DM |
DMA |
East Caribbean Dollar | XCD |
EN |
| 🇩🇴 | Dominican Republic | DO |
DOM |
Dominican Peso | DOP |
ES |
| 🇪🇨 | Ecuador | EC |
ECU |
US Dollar | USD |
ES |
| 🇪🇬 | Egypt | EG |
EGY |
Egyptian Pound | EGP |
AR |
| 🇸🇻 | El Salvador | SV |
SLV |
US Dollar | USD |
ES |
| 🇬🇶 | Equatorial Guinea | GQ |
GNQ |
Central African CFA Franc | XAF |
ES |
| 🇪🇷 | Eritrea | ER |
ERI |
Eritrean Nakfa | ERN |
TI |
| 🇪🇪 | Estonia | EE |
EST |
Euro | EUR |
ET |
| 🇪🇹 | Ethiopia | ET |
ETH |
Ethiopian Birr | ETB |
AM |
| 🇸🇿 | Eswatini | SZ |
SWZ |
Swazi Lilangeni | SZL |
EN |
| 🇫🇯 | Fiji | FJ |
FJI |
Fijian Dollar | FJD |
EN |
| 🇫🇮 | Finland | FI |
FIN |
Euro | EUR |
FI |
| 🇬🇦 | Gabon | GA |
GAB |
Central African CFA Franc | XAF |
FR |
| 🇬🇲 | Gambia | GM |
GMB |
Gambian Dalasi | GMD |
EN |
| 🇬🇪 | Georgia | GE |
GEO |
Georgian Lari | GEL |
KA |
| 🇬🇭 | Ghana | GH |
GHA |
Ghanaian Cedi | GHS |
EN |
| 🇬🇷 | Greece | GR |
GRC |
Euro | EUR |
EL |
| 🇬🇩 | Grenada | GD |
GRD |
East Caribbean Dollar | XCD |
EN |
| 🇬🇹 | Guatemala | GT |
GTM |
Guatemalan Quetzal | GTQ |
ES |
| 🇬🇳 | Guinea | GN |
GIN |
Guinean Franc | GNF |
FR |
| 🇬🇼 | Guinea-Bissau | GW |
GNB |
West African CFA Franc | XOF |
PT |
| 🇬🇾 | Guyana | GY |
GUY |
Guyanaese Dollar | GYD |
EN |
| 🇭🇹 | Haiti | HT |
HTI |
Haitian Gourde, US Dollar | HTG, USD |
HT |
| 🇻🇦 | Holy See | VA |
VAT |
Euro | EUR |
IT |
| 🇭🇳 | Honduras | HN |
HND |
Honduran Lempira | HNL |
ES |
| 🇭🇰 | Hong Kong | HK |
HKG |
Hong Kong Dollar | HKD |
ZH |
| 🇭🇺 | Hungary | HU |
HUN |
Hungarian Forint | HUF |
HU |
| 🇮🇸 | Iceland | IS |
ISL |
Icelandic Króna | ISK |
IS |
| 🇮🇩 | Indonesia | ID |
IDN |
Indonesian Rupiah | IDR |
ID |
| 🇮🇷 | Iran (Islamic Republic of) | IR |
IRN |
Iranian Rial | IRR |
FA |
| 🇮🇶 | Iraq | IQ |
IRQ |
Iraqi Dinar | IQD |
AR |
| 🇮🇪 | Ireland | IE |
IRL |
Euro | EUR |
EN |
| 🇮🇱 | Israel | IL |
ISR |
Israeli New Shekel | ILS |
HE |
| 🇮🇹 | Italy | IT |
ITA |
Euro | EUR |
IT |
| 🇯🇲 | Jamaica | JM |
JAM |
Jamaican Dollar | JMD |
EN |
| 🇯🇴 | Jordan | JO |
JOR |
Jordanian Dinar | JOD |
AR |
| 🇰🇿 | Kazakhstan | KZ |
KAZ |
Kazakhstani Tenge | KZT |
RU |
| 🇰🇪 | Kenya | KE |
KEN |
Kenyan Shilling | KES |
SW |
| 🇰🇮 | Kiribati | KI |
KIR |
Australian Dollar | AUD |
EN |
| 🇰🇵 | Korea (Democratic People's Republic of) | KP |
PRK |
North Korean Won | KPW |
KO |
| 🇰🇷 | Korea (Republic of) | KR |
KOR |
South Korean Won | KRW |
KO |
| 🇽🇰 | Kosovo | XK |
XKX |
Euro | EUR |
SQ |
| 🇰🇼 | Kuwait | KW |
KWT |
Kuwaiti Dinar | KWD |
AR |
| 🇰🇬 | Kyrgyzstan | KG |
KGZ |
Kyrgyz Som | KGS |
KY |
| 🇱🇦 | Lao People's Democratic Republic | LA |
LAO |
Laotian Kip | LAK |
LO |
| 🇱🇻 | Latvia | LV |
LVA |
Euro | EUR |
LV |
| 🇱🇧 | Lebanon | LB |
LBN |
Lebanese Pound | LBP |
AR |
| 🇱🇸 | Lesotho | LS |
LSO |
South African Rand, Lesotho Loti | ZAR, LSL |
ST |
| 🇱🇷 | Liberia | LR |
LBR |
Liberian Dollar | LRD |
EN |
| 🇱🇾 | Libya | LY |
LBY |
Libyan Dinar | LYD |
AR |
| 🇱🇮 | Liechtenstein | LI |
LIE |
Swiss Franc | CHF |
DE |
| 🇱🇹 | Lithuania | LT |
LTU |
Euro | EUR |
LT |
| 🇱🇺 | Luxembourg | LU |
LUX |
Euro | EUR |
FR |
| 🇲🇴 | Macao | MO |
MAC |
Macanese Pataca | MOP |
ZH |
| 🇲🇰 | North Macedonia | MK |
MKD |
Macedonian Denar | MKD |
MK |
| 🇲🇬 | Madagascar | MG |
MDG |
Malagasy Ariary | MGA |
MG |
| 🇲🇼 | Malawi | MW |
MWI |
Malawian Kwacha | MWK |
EN |
| 🇲🇾 | Malaysia | MY |
MYS |
Malaysian Ringgit | MYR |
MS |
| 🇲🇻 | Maldives | MV |
MDV |
Maldivian Rufiyaa | MVR |
DV |
| 🇲🇱 | Mali | ML |
MLI |
West African CFA Franc | XOF |
FR |
| 🇲🇹 | Malta | MT |
MLT |
Euro | EUR |
MT |
| 🇲🇭 | Marshall Islands | MH |
MHL |
US Dollar | USD |
EN |
| 🇲🇷 | Mauritania | MR |
MRT |
Mauritanian Ouguiya | MRU |
AR |
| 🇲🇺 | Mauritius | MU |
MUS |
Mauritian Rupee | MUR |
FR |
| 🇲🇽 | Mexico | MX |
MEX |
Mexican Peso | MXN |
ES |
| 🇫🇲 | Micronesia (Federated States of) | FM |
FSM |
US Dollar | USD |
EN |
| 🇲🇩 | Moldova (Republic of) | MD |
MDA |
Moldovan Leu | MDL |
RO |
| 🇲🇨 | Monaco | MC |
MCO |
Euro | EUR |
FR |
| 🇲🇳 | Mongolia | MN |
MNG |
Mongolian Tugrik | MNT |
MN |
| 🇲🇪 | Montenegro | ME |
MNE |
Euro | EUR |
SR |
| 🇲🇦 | Morocco | MA |
MAR |
Moroccan Dirham | MAD |
AR |
| 🇲🇿 | Mozambique | MZ |
MOZ |
Mozambican Metical | MZN |
PT |
| 🇲🇲 | Myanmar | MM |
MMR |
Myanmar Kyat | MMK |
MY |
| 🇳🇦 | Namibia | NA |
NAM |
Namibian Dollar, South African Rand | NAD, ZAR |
EN |
| 🇳🇷 | Naoero | NR |
NRU |
Australian Dollar | AUD |
EN |
| 🇳🇵 | Nepal | NP |
NPL |
Nepalese Rupee | NPR |
NE |
| 🇳🇱 | Netherlands | NL |
NLD |
Euro | EUR |
NL |
| 🇳🇮 | Nicaragua | NI |
NIC |
Nicaraguan Córdoba | NIO |
ES |
| 🇳🇪 | Niger | NE |
NER |
West African CFA Franc | XOF |
FR |
| 🇳🇬 | Nigeria | NG |
NGA |
Nigerian Naira | NGN |
EN |
| 🇳🇴 | Norway | NO |
NOR |
Norwegian Krone | NOK |
NB |
| 🇴🇲 | Oman | OM |
OMN |
Omani Rial | OMR |
AR |
| 🇵🇰 | Pakistan | PK |
PAK |
Pakistani Rupee | PKR |
UR |
| 🇵🇼 | Palau | PW |
PLW |
US Dollar | USD |
PAU |
| 🇵🇸 | Palestine, State of | PS |
PSE |
Israeli New Shekel, Jordanian Dinar | ILS, JOD |
AR |
| 🇵🇦 | Panama | PA |
PAN |
Panamanian Balboa, US Dollar | PAB, USD |
ES |
| 🇵🇬 | Papua New Guinea | PG |
PNG |
Papua New Guinean Kina | PGK |
TPI |
| 🇵🇾 | Paraguay | PY |
PRY |
Paraguayan Guarani | PYG |
GN |
| 🇵🇪 | Peru | PE |
PER |
Peruvian Sol | PEN |
ES |
| 🇵🇭 | Philippines | PH |
PHL |
Philippine Peso | PHP |
EN |
| 🇵🇱 | Poland | PL |
POL |
Polish Zloty | PLN |
PL |
| 🇵🇹 | Portugal | PT |
PRT |
Euro | EUR |
PT |
| 🇶🇦 | Qatar | QA |
QAT |
Qatari Riyal | QAR |
AR |
| 🇷🇴 | Romania | RO |
ROU |
Romanian Leu | RON |
RO |
| 🇷🇺 | Russian Federation | RU |
RUS |
Russian Ruble | RUB |
RU |
| 🇷🇼 | Rwanda | RW |
RWA |
Rwandan Franc | RWF |
RW |
| 🇰🇳 | Saint Kitts and Nevis | KN |
KNA |
East Caribbean Dollar | XCD |
EN |
| 🇱🇨 | Saint Lucia | LC |
LCA |
East Caribbean Dollar | XCD |
EN |
| 🇻🇨 | Saint Vincent and the Grenadines | VC |
VCT |
East Caribbean Dollar | XCD |
EN |
| 🇼🇸 | Samoa | WS |
WSM |
Samoan Tala | WST |
SM |
| 🇸🇲 | San Marino | SM |
SMR |
Euro | EUR |
IT |
| 🇸🇹 | Sao Tome and Principe | ST |
STP |
São Tomé & Príncipe Dobra | STN |
PT |
| 🇸🇳 | Senegal | SN |
SEN |
West African CFA Franc | XOF |
WO |
| 🇷🇸 | Serbia | RS |
SRB |
Serbian Dinar | RSD |
SR |
| 🇸🇨 | Seychelles | SC |
SYC |
Seychellois Rupee | SCR |
FR |
| 🇸🇱 | Sierra Leone | SL |
SLE |
Sierra Leonean Leone | SLE |
EN |
| 🇸🇰 | Slovakia | SK |
SVK |
Euro | EUR |
SK |
| 🇸🇮 | Slovenia | SI |
SVN |
Euro | EUR |
SL |
| 🇸🇧 | Solomon Islands | SB |
SLB |
Solomon Islands Dollar | SBD |
EN |
| 🇸🇴 | Somalia | SO |
SOM |
Somali Shilling | SOS |
SO |
| 🇸🇸 | South Sudan | SS |
SSD |
South Sudanese Pound | SSP |
EN |
| 🇪🇸 | Spain | ES |
ESP |
Euro | EUR |
ES |
| 🇱🇰 | Sri Lanka | LK |
LKA |
Sri Lankan Rupee | LKR |
SI |
| 🇸🇩 | Sudan | SD |
SDN |
Sudanese Pound | SDG |
AR |
| 🇸🇷 | Suriname | SR |
SUR |
Surinamese Dollar | SRD |
NL |
| 🇸🇪 | Sweden | SE |
SWE |
Swedish Krona | SEK |
SV |
| 🇨🇭 | Switzerland | CH |
CHE |
Swiss Franc | CHF |
DE |
| 🇸🇾 | Syrian Arab Republic | SY |
SYR |
Syrian Pound | SYP |
AR |
| 🇹🇼 | Taiwan (Province of China) | TW |
TWN |
New Taiwan Dollar | TWD |
ZH |
| 🇹🇯 | Tajikistan | TJ |
TJK |
Tajikistani Somoni | TJS |
TG |
| 🇹🇿 | Tanzania, United Republic of | TZ |
TZA |
Tanzanian Shilling | TZS |
SW |
| 🇹🇭 | Thailand | TH |
THA |
Thai Baht | THB |
TH |
| 🇹🇱 | Timor-Leste | TL |
TLS |
US Dollar | USD |
PT |
| 🇹🇬 | Togo | TG |
TGO |
West African CFA Franc | XOF |
FR |
| 🇹🇴 | Tonga | TO |
TON |
Tongan Paʻanga | TOP |
TO |
| 🇹🇹 | Trinidad and Tobago | TT |
TTO |
Trinidad & Tobago Dollar | TTD |
EN |
| 🇹🇳 | Tunisia | TN |
TUN |
Tunisian Dinar | TND |
AR |
| 🇹🇷 | Türkiye | TR |
TUR |
Turkish Lira | TRY |
TR |
| 🇹🇲 | Turkmenistan | TM |
TKM |
Turkmenistani Manat | TMT |
TK |
| 🇹🇻 | Tuvalu | TV |
TUV |
Australian Dollar | AUD |
TVL |
| 🇺🇬 | Uganda | UG |
UGA |
Ugandan Shilling | UGX |
SW |
| 🇺🇦 | Ukraine | UA |
UKR |
Ukrainian Hryvnia | UAH |
UK |
| 🇺🇾 | Uruguay | UY |
URY |
Uruguayan Peso | UYU |
ES |
| 🇺🇿 | Uzbekistan | UZ |
UZB |
Uzbekistani Som | UZS |
UZ |
| 🇻🇺 | Vanuatu | VU |
VUT |
Vanuatu Vatu | VUV |
BI |
| 🇻🇪 | Venezuela (Bolivarian Republic of) | VE |
VEN |
Venezuelan Bolívar | VES |
ES |
| 🇻🇳 | Viet Nam | VN |
VNM |
Vietnamese Dong | VND |
VI |
| 🇪🇭 | Western Sahara | EH |
ESH |
Moroccan Dirham | MAD |
AR |
| 🇾🇪 | Yemen | YE |
YEM |
Yemeni Rial | YER |
AR |
| 🇿🇲 | Zambia | ZM |
ZMB |
Zambian Kwacha | ZMW |
EN |
| 🇿🇼 | Zimbabwe | ZW |
ZWE |
Zimbabwean Gold, US Dollar | ZWG, USD |
SN |
Currency assignments follow current Unicode CLDR tender data.
—indicates that no single current official currency is assigned in that dataset.
Build dropdowns and validate input using the discovery API:
$converter->isSupportedCountry('IND'); // true $converter->isSupportedCountry('IN'); // true $converter->normalizeCountryCode('IN'); // IND $converter->isSupportedCurrency('INR'); // true $countries = $converter->supportedCountries(); $currencies = $converter->supportedCurrencies();
Unknown but valid ICU currencies use their English display name and generic Minor Unit wording. Register a custom definition when exact minor-unit terminology is required.
✅ Requirements
- PHP 8.1 or newer
- PHP
intlextension - Composer
The language-specific packages contain their own runtime requirements.
Android package requirements:
- Android API 21 or newer
- JDK 17 and Android SDK 35 for building the AAR
- Decimal-string inputs for financial values
🧪 Development
git clone https://github.com/3mdikram/WorldMoneyWords.git
cd WorldMoneyWords
composer install
composer check
Run each implementation's tests:
# PHP composer test # Python cd python && PYTHONPATH=src python3 -m unittest discover -s tests # Go GOFLAGS=-mod=mod go test -race ./... cd go && go test ./... # Java cd java && mvn verify # Android / Kotlin (unreleased AAR) gradle -p android testDebugUnitTest assembleRelease # TypeScript cd react && npm install && npm test
🤝 Contributing
Contributions are welcome. Read CONTRIBUTING.md, add tests for behavioral changes, and open a pull request.
📄 License
WorldMoneyWords is open-source software released under the MIT License.
Made for developers building invoices, payments, banking tools, receipts, and financial applications.