kwn/number-to-words
Convert numbers and currency amounts to words in PHP. Supports multiple languages via RFC 3066 identifiers, with number and currency transformers. Simple API: create transformers or use static calls to render values like 5120 as “five thousand one hundred twenty”.
## Getting Started
### Minimal Setup
Install via Composer:
```bash
composer require kwn/number-to-words
use NumberToWords\NumberToWords;
// Convert a number to words in English
$converter = new NumberToWords();
echo $converter->getNumberTransformer('en')->toWords(12345);
// Output: "twelve thousand three hundred forty-five"
// Convert currency to words (requires integer cents)
echo $converter->getCurrencyTransformer('en')->toWords(12345, 'USD');
// Output: "one hundred twenty-three dollars forty-five cents"
README.md for supported languages/currencies (including Hungarian fixes).NumberToWords::transformNumber() or NumberToWords::transformCurrency() for quick conversions.tests/ for edge cases and examples (Hungarian locale tests added in PR #198).// app/Providers/AppServiceProvider.php
use NumberToWords\NumberToWords;
public function register()
{
$this->app->singleton('number-to-words', function () {
return new NumberToWords();
});
}
Usage in Controllers/Blades:
// Controller
public function invoice(Invoice $invoice)
{
$converter = app('number-to-words');
$amountWords = $converter->getCurrencyTransformer('en')->toWords(
$invoice->amount * 100,
$invoice->currency
);
return view('invoice', compact('amountWords'));
}
// Use app's locale or request locale
$locale = app()->getLocale();
$transformer = app('number-to-words')->getNumberTransformer($locale);
// Explicit Hungarian support (fixed in 3.0.1)
$hungarianTransformer = app('number-to-words')->getNumberTransformer('hu');
echo $hungarianTransformer->toWords(12345);
// Output: "tizenháromezer négyszáznegyvenöt" (correct Hungarian formatting)
// Break down large numbers for readability
$number = 123456789;
$parts = [
$transformer->toWords($number) => 'total',
$transformer->toWords(floor($number / 1000)) => 'thousands',
];
// Handle currency-specific formatting (e.g., "and" in UK English)
$ukTransformer = app('number-to-words')->getCurrencyTransformer('en_GB');
$amountWords = $ukTransformer->toWords(123456, 'GBP');
// Output: "one hundred twenty-three thousand four hundred fifty-six pounds"
// Cache transformed numbers/currencies
$cacheKey = "number_to_words_{$locale}_{$number}";
$words = Cache::remember($cacheKey, now()->addHours(1), function () use ($transformer, $number) {
return $transformer->toWords($number);
});
Floating-Point Inputs:
50.99 directly fails.$transformer->toWords((int)($amount * 100), 'USD');
Locale Mismatches:
hu vs. hu_HU) may behave differently.hu_HU for Hungarian).Negative Numbers:
$number = -123;
$words = $number < 0 ? 'minus ' . $transformer->toWords(abs($number)) : $transformer->toWords($number);
Currency Code Sensitivity:
USD vs. usd may fail silently.USD, EUR).Albanian Limitation:
Check Supported Locales: Run php artisan tinker and dump:
$converter = new \NumberToWords\NumberToWords();
print_r($converter->getSupportedLocales());
Note: Verify Hungarian (hu) is listed and working correctly.
Test Edge Cases:
$transformer->toWords(0); // "zero"
$transformer->toWords(1000000); // "one million"
$transformer->toWords(999999); // "nine hundred ninety-nine thousand nine hundred ninety-nine"
Validate Currency Codes:
$currencyTransformer->toWords(100, 'XYZ'); // Throws exception if 'XYZ' is unsupported.
Custom Locales:
\NumberToWords\Transformers\NumberTransformer or \NumberToWords\Transformers\CurrencyTransformer for unsupported languages.app/Transformers/CustomTransformer.php and register it in the service provider.Override Default Behavior:
toWords() method to add custom formatting (e.g., HTML tags):
$transformer->toWords(123, true); // Pass a flag for custom formatting
Add Currency Support:
\NumberToWords\Transformers\CurrencyTransformer and override getCurrencyName() and getCentName():
class CustomCurrencyTransformer extends CurrencyTransformer {
protected function getCurrencyName($currencyCode) {
$names = ['CUSTOM' => 'Custom Coin'];
return $names[$currencyCode] ?? parent::getCurrencyName($currencyCode);
}
}
Performance Optimization:
$this->app->singleton('currency-transformer.en', function () {
return app('number-to-words')->getCurrencyTransformer('en');
});
app()->getLocale() may return en_US instead of en. Handle fallbacks:
$locale = str_replace('_', '-', app()->getLocale());
// app/Providers/BladeServiceProvider.php
Blade::directive('numberToWords', function ($locale) {
return "<?php echo app('number-to-words')->getNumberTransformer({$locale})->toWords(";
});
Usage in Blade:
@numberToWords('hu')(12345) @endnumberToWords
$huTransformer = app('number-to-words')->getNumberTransformer('hu');
echo $huTransformer->toWords(1000); // Should output "ezren" (not "ezer")
1000000) to ensure proper formatting.
NO_UPDATE_NEEDED would not apply here due to the meaningful Hungarian locale fix.
How can I help you explore Laravel packages today?