├── .styleci.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── composer.json ├── config └── config.php └── src ├── BaseClass.php ├── CurrencyTransformer ├── AlbanianCurrencyTransformer.php ├── CurrencyTransformer.php ├── DanishCurrencyTransformer.php ├── EnglishCurrencyTransformer.php ├── FrenchCurrencyTransformer.php ├── GeorgianCurrencyTransformer.php ├── GermanCurrencyTransformer.php ├── HungarianCurrencyTransformer.php ├── LatvianCurrencyTransformer.php ├── LithuanianCurrencyTransformer.php ├── PolishCurrencyTransformer.php ├── PortugueseBrazilianCurrencyTransformer.php ├── RomanianCurrencyTransformer.php ├── RussianCurrencyTransformer.php ├── SlovakCurrencyTransformer.php ├── SpanishCurrencyTransformer.php ├── TurkishCurrencyTransformer.php ├── TurkmenCurrencyTransformer.php ├── UkrainianCurrencyTransformer.php └── YorubaCurrencyTransformer.php ├── Exception └── NumberToWordsException.php ├── Grammar ├── CurrencyTransformerBuilder.php ├── Form.php └── Gender.php ├── Language ├── Albanian │ ├── AlbanianDictionary.php │ ├── AlbanianExponentGetter.php │ └── AlbanianTripletTransformer.php ├── Dictionary.php ├── English │ ├── EnglishDictionary.php │ ├── EnglishExponentGetter.php │ └── EnglishTripletTransformer.php ├── ExponentGetter.php ├── ExponentInflector.php ├── French │ └── BelgianDictionary.php ├── German │ ├── GermanDictionary.php │ ├── GermanExponentInflector.php │ └── GermanTripletTransformer.php ├── Latvian │ ├── LatvianDictionary.php │ ├── LatvianExponentInflector.php │ └── LatvianTripletTransformer.php ├── Lithuania │ └── LithuaniaDictionary.php ├── Persian │ ├── PersianDictionary.php │ ├── PersianExponentGetter.php │ └── PersianTripletTransformer.php ├── Polish │ ├── PolishDictionary.php │ ├── PolishExponentInflector.php │ ├── PolishNounGenderInflector.php │ └── PolishTripletTransformer.php ├── PowerAwareTripletTransformer.php ├── Romanian │ └── Dictionary.php ├── Slovak │ ├── SlovakDictionary.php │ ├── SlovakExponentInflector.php │ ├── SlovakNounGenderInflector.php │ └── SlovakTripletTransformer.php └── TripletTransformer.php ├── Legacy └── Numbers │ ├── Words.php │ └── Words │ └── Locale │ ├── Bg.php │ ├── Cs.php │ ├── Dk.php │ ├── Es.php │ ├── Et.php │ ├── Fr.php │ ├── Fr │ └── Be.php │ ├── Hu.php │ ├── Id.php │ ├── It.php │ ├── Ka.php │ ├── Lt.php │ ├── Ms.php │ ├── Nl.php │ ├── Pt │ └── Br.php │ ├── Ro.php │ ├── Ru.php │ ├── Sv.php │ ├── Tk.php │ ├── Tr.php │ ├── Ua.php │ └── Yo.php ├── NumberToWords.php ├── NumberToWordsFacade.php ├── NumberToWordsServiceProvider.php ├── NumberTransformer ├── AlbanianNumberTransformer.php ├── BulgarianNumberTransformer.php ├── CzechNumberTransformer.php ├── DanishNumberTransformer.php ├── DutchNumberTransformer.php ├── EnglishNumberTransformer.php ├── EstonianNumberTransformer.php ├── FrenchBelgianNumberTransformer.php ├── FrenchNumberTransformer.php ├── GenericNumberTransformer.php ├── GeorgianNumberTransformer.php ├── GermanNumberTransformer.php ├── HungarianNumberTransformer.php ├── IndonesianNumberTransformer.php ├── ItalianNumberTransformer.php ├── LatvianNumberTransformer.php ├── LithuanianNumberTransformer.php ├── MalayNumberTransformer.php ├── NumberTransformer.php ├── NumberTransformerBuilder.php ├── PersianNumberTransformer.php ├── PolishNumberTransformer.php ├── PortugueseBrazilianNumberTransformer.php ├── RomanianNumberTransformer.php ├── RussianNumberTransformer.php ├── SlovakNumberTransformer.php ├── SpanishNumberTransformer.php ├── SwedishNumberTransformer.php ├── TurkishNumberTransformer.php ├── TurkmenNumberTransformer.php ├── UkrainianNumberTransformer.php └── YorubaNumberTransformer.php ├── Service └── NumberToTripletsConverter.php └── TransformerOptions └── CurrencyTransformerOptions.php /.styleci.yml: -------------------------------------------------------------------------------- 1 | preset: laravel 2 | 3 | disabled: 4 | - single_class_element_per_statement 5 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to `number-to-words` will be documented in this file 4 | 5 | ## 1.0.0 - 2020-01-27 6 | 7 | - initial release 8 | 9 | ## 2.0.0 - 2023-03-31 10 | 11 | - Updated PHP version to 8.0 12 | 13 | ## 3.0.0 - 2023-03-31 14 | 15 | - Updated PHP version to 8.1 16 | - Removes old dependency from kvn/number-to-words 17 | 18 | ## 3.0.1 - 2023-03-31 19 | 20 | - Removes orchestra test bench from composer.json 21 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Contributions are **welcome** and will be fully **credited**. 4 | 5 | Please read and understand the contribution guide before creating an issue or pull request. 6 | 7 | ## Etiquette 8 | 9 | This project is open source, and as such, the maintainers give their free time to build and maintain the source code 10 | held within. They make the code freely available in the hope that it will be of use to other developers. It would be 11 | extremely unfair for them to suffer abuse or anger for their hard work. 12 | 13 | Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the 14 | world that developers are civilized and selfless people. 15 | 16 | It's the duty of the maintainer to ensure that all submissions to the project are of sufficient 17 | quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used. 18 | 19 | ## Viability 20 | 21 | When requesting or submitting new features, first consider whether it might be useful to others. Open 22 | source projects are used by many developers, who may have entirely different needs to your own. Think about 23 | whether or not your feature is likely to be used by other users of the project. 24 | 25 | ## Procedure 26 | 27 | Before filing an issue: 28 | 29 | - Attempt to replicate the problem, to ensure that it wasn't a coincidental incident. 30 | - Check to make sure your feature suggestion isn't already present within the project. 31 | - Check the pull requests tab to ensure that the bug doesn't have a fix in progress. 32 | - Check the pull requests tab to ensure that the feature isn't already in progress. 33 | 34 | Before submitting a pull request: 35 | 36 | - Check the codebase to ensure that your feature doesn't already exist. 37 | - Check the pull requests to ensure that another person hasn't already submitted the feature or fix. 38 | 39 | ## Requirements 40 | 41 | If the project maintainer has any additional requirements, you will find them listed here. 42 | 43 | - **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](https://pear.php.net/package/PHP_CodeSniffer). 44 | 45 | - **Add tests!** - Your patch won't be accepted if it doesn't have tests. 46 | 47 | - **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. 48 | 49 | - **Consider our release cycle** - We try to follow [SemVer v2.0.0](https://semver.org/). Randomly breaking public APIs is not an option. 50 | 51 | - **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. 52 | 53 | - **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. 54 | 55 | **Happy coding**! 56 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Oliver Sarfas 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Laravel Facade to convert from numbers to human readable text 2 | 3 | [![Total Downloads](https://img.shields.io/packagist/dt/oliversarfas/number-to-words.svg?style=flat-square)](https://packagist.org/packages/cleveregg-digital/number-to-words) 4 | 5 | PHP 8.x and Laravel Wrapper for [kwn/number-to-words](https://github.com/kwn/number-to-words) 6 | 7 | ## Installation 8 | 9 | You can install the package via composer: 10 | 11 | ```bash 12 | composer require cleveregg-digital/number-to-words 13 | ``` 14 | 15 | ## Usage 16 | 17 | To convert your number to words, simply call the static function on the `NumberToWords` facade. 18 | 19 | ```php 20 | \NumberToWords::toWords(5120); // outputs "five thousand one hundred twenty" 21 | ``` 22 | 23 | If you'd like to change the language, add the RFC 3066 language identifier in as a parameter. 24 | 25 | ```php 26 | \NumberToWords::toWords(5120, 'es'); // outputs "cinco mil ciento veinte" 27 | ``` 28 | 29 | To add currency, supply the ISO 4217 currency identifier 30 | 31 | 32 | ```php 33 | \NumberToWords::toWords(512000, 'en', 'USD'); // outputs "five thousand one hundred twenty dollars" 34 | ``` 35 | 36 | ### Testing 37 | 38 | ``` bash 39 | composer test 40 | ``` 41 | 42 | ### Changelog 43 | 44 | Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. 45 | 46 | ## Contributing 47 | 48 | Please see [CONTRIBUTING](CONTRIBUTING.md) for details. 49 | 50 | ### Security 51 | 52 | If you discover any security related issues, please email oliver@cleveregg.io instead of using the issue tracker. 53 | 54 | ## Credits 55 | 56 | - [Oliver Sarfas](https://github.com/oliversarfas) 57 | - [All Contributors](../../contributors) 58 | 59 | ## License 60 | 61 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 62 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cleveregg-digital/number-to-words", 3 | "description": "Laravel Wrapper for kwn/number-to-words", 4 | "keywords": [ 5 | "cleveregg-digital", 6 | "number-to-words" 7 | ], 8 | "homepage": "https://github.com/cleveregg-digital/number-to-words", 9 | "license": "MIT", 10 | "type": "library", 11 | "authors": [ 12 | { 13 | "name": "Oliver Sarfas", 14 | "email": "oliver@cleveregg.io", 15 | "role": "Developer" 16 | } 17 | ], 18 | "require": { 19 | "php": "^8.1" 20 | }, 21 | "require-dev": { 22 | "brianium/paratest": "^0.4.3", 23 | "phpunit/phpunit": "^8.5.33" 24 | }, 25 | "autoload": { 26 | "psr-4": { 27 | "CleverEggDigital\\NumberToWords\\": "src" 28 | } 29 | }, 30 | "autoload-dev": { 31 | "psr-4": { 32 | "CleverEggDigital\\NumberToWords\\Tests\\": "tests" 33 | } 34 | }, 35 | "scripts": { 36 | "test": "vendor/bin/phpunit", 37 | "test-coverage": "vendor/bin/phpunit --coverage-html coverage" 38 | 39 | }, 40 | "config": { 41 | "sort-packages": true 42 | }, 43 | "extra": { 44 | "laravel": { 45 | "providers": [ 46 | "CleverEggDigital\\NumberToWords\\NumberToWordsServiceProvider" 47 | ], 48 | "aliases": { 49 | "NumberToWords": "CleverEggDigital\\NumberToWords\\NumberToWordsFacade" 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /config/config.php: -------------------------------------------------------------------------------- 1 | AlbanianNumberTransformer::class, 60 | 'bg' => BulgarianNumberTransformer::class, 61 | 'cs' => CzechNumberTransformer::class, 62 | 'de' => GermanNumberTransformer::class, 63 | 'dk' => DanishNumberTransformer::class, 64 | 'en' => EnglishNumberTransformer::class, 65 | 'es' => SpanishNumberTransformer::class, 66 | 'et' => EstonianNumberTransformer::class, 67 | 'fa' => PersianNumberTransformer::class, 68 | 'fr' => FrenchNumberTransformer::class, 69 | 'fr_BE' => FrenchBelgianNumberTransformer::class, 70 | 'hu' => HungarianNumberTransformer::class, 71 | 'id' => IndonesianNumberTransformer::class, 72 | 'it' => ItalianNumberTransformer::class, 73 | 'ka' => GeorgianNumberTransformer::class, 74 | 'lt' => LithuanianNumberTransformer::class, 75 | 'lv' => LatvianNumberTransformer::class, 76 | 'ms' => MalayNumberTransformer::class, 77 | 'nl' => DutchNumberTransformer::class, 78 | 'pl' => PolishNumberTransformer::class, 79 | 'pt_BR' => PortugueseBrazilianNumberTransformer::class, 80 | 'ro' => RomanianNumberTransformer::class, 81 | 'ru' => RussianNumberTransformer::class, 82 | 'sk' => SlovakNumberTransformer::class, 83 | 'sv' => SwedishNumberTransformer::class, 84 | 'tk' => TurkmenNumberTransformer::class, 85 | 'tr' => TurkishNumberTransformer::class, 86 | 'ua' => UkrainianNumberTransformer::class, 87 | 'yo' => YorubaNumberTransformer::class, 88 | ]; 89 | 90 | private array $currencyTransformers = [ 91 | 'al' => AlbanianCurrencyTransformer::class, 92 | 'de' => GermanCurrencyTransformer::class, 93 | 'dk' => DanishCurrencyTransformer::class, 94 | 'en' => EnglishCurrencyTransformer::class, 95 | 'es' => SpanishCurrencyTransformer::class, 96 | 'fr' => FrenchCurrencyTransformer::class, 97 | 'hu' => HungarianCurrencyTransformer::class, 98 | 'ka' => GeorgianCurrencyTransformer::class, 99 | 'lt' => LithuanianCurrencyTransformer::class, 100 | 'lv' => LatvianCurrencyTransformer::class, 101 | 'pl' => PolishCurrencyTransformer::class, 102 | 'pt_BR' => PortugueseBrazilianCurrencyTransformer::class, 103 | 'ro' => RomanianCurrencyTransformer::class, 104 | 'ru' => RussianCurrencyTransformer::class, 105 | 'sk' => SlovakCurrencyTransformer::class, 106 | 'tk' => TurkmenCurrencyTransformer::class, 107 | 'tr' => TurkishCurrencyTransformer::class, 108 | 'ua' => UkrainianCurrencyTransformer::class, 109 | 'yo' => YorubaCurrencyTransformer::class 110 | ]; 111 | 112 | public function getNumberTransformer(string $language): NumberTransformer 113 | { 114 | if (!array_key_exists($language, $this->numberTransformers)) { 115 | throw new \InvalidArgumentException(sprintf( 116 | 'Number transformer for "%s" language is not implemented.', 117 | $language 118 | )); 119 | } 120 | 121 | return new $this->numberTransformers[$language]; 122 | } 123 | 124 | public function getCurrencyTransformer(string $language): CurrencyTransformer 125 | { 126 | if (!array_key_exists($language, $this->currencyTransformers)) { 127 | throw new \InvalidArgumentException(sprintf( 128 | 'Currency transformer for "%s" language is not implemented.', 129 | $language 130 | )); 131 | } 132 | 133 | return new $this->currencyTransformers[$language]; 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/AlbanianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 29 | ->withWordsSeparatedBy(' ') 30 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 31 | ->useRegularExponents($exponentInflector) 32 | ->build(); 33 | 34 | $decimal = (int) ($amount / 100); 35 | $fraction = abs($amount % 100); 36 | 37 | if ($fraction === 0) { 38 | $fraction = null; 39 | } 40 | 41 | $currency = strtoupper($currency); 42 | 43 | if (!array_key_exists($currency, AlbanianDictionary::$currencyNames)) { 44 | throw new NumberToWordsException( 45 | sprintf('Paraja "%s" për gjuhën "%s" nuk është në dispozicion', $currency, get_class($this)) 46 | ); 47 | } 48 | 49 | $currencyNames = AlbanianDictionary::$currencyNames[$currency]; 50 | 51 | $return = trim($numberTransformer->toWords($decimal)); 52 | $level = ($decimal === 1) ? 0 : 1; 53 | 54 | if ($level > 0) { 55 | if (count($currencyNames[0]) > 1) { 56 | $return .= ' ' . $currencyNames[0][$level]; 57 | } else { 58 | $return .= ' ' . $currencyNames[0][0] . 's'; 59 | } 60 | } else { 61 | $return .= ' ' . $currencyNames[0][0]; 62 | } 63 | 64 | if (null !== $fraction) { 65 | $return .= ' ' . trim($numberTransformer->toWords($fraction)); 66 | 67 | $level = $fraction === 1 ? 0 : 1; 68 | 69 | if ($level > 0) { 70 | if (count($currencyNames[1]) > 1) { 71 | $return .= ' ' . $currencyNames[1][$level]; 72 | } else { 73 | $return .= ' ' . $currencyNames[1][0] . 's'; 74 | } 75 | } else { 76 | $return .= ' ' . $currencyNames[1][0]; 77 | } 78 | } 79 | 80 | return $return; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/CurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'dk', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/EnglishCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 29 | ->withWordsSeparatedBy(' ') 30 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 31 | ->useRegularExponents($exponentInflector) 32 | ->build(); 33 | 34 | $decimal = (int) ($amount / 100); 35 | $fraction = abs($amount % 100); 36 | 37 | if ($fraction === 0) { 38 | $fraction = null; 39 | } 40 | 41 | $currency = strtoupper($currency); 42 | 43 | if (!array_key_exists($currency, EnglishDictionary::$currencyNames)) { 44 | throw new NumberToWordsException( 45 | sprintf('Currency "%s" is not available for "%s" language', $currency, get_class($this)) 46 | ); 47 | } 48 | 49 | $currencyNames = EnglishDictionary::$currencyNames[$currency]; 50 | 51 | $return = trim($numberTransformer->toWords($decimal)); 52 | $level = ($decimal === 1) ? 0 : 1; 53 | 54 | if ($level > 0) { 55 | if (count($currencyNames[0]) > 1) { 56 | $return .= ' ' . $currencyNames[0][$level]; 57 | } else { 58 | $return .= ' ' . $currencyNames[0][0] . 's'; 59 | } 60 | } else { 61 | $return .= ' ' . $currencyNames[0][0]; 62 | } 63 | 64 | if (null !== $fraction) { 65 | $return .= ' ' . trim($numberTransformer->toWords($fraction)); 66 | 67 | $level = $fraction === 1 ? 0 : 1; 68 | 69 | if ($level > 0) { 70 | if (count($currencyNames[1]) > 1) { 71 | $return .= ' ' . $currencyNames[1][$level]; 72 | } else { 73 | $return .= ' ' . $currencyNames[1][0] . 's'; 74 | } 75 | } else { 76 | $return .= ' ' . $currencyNames[1][0]; 77 | } 78 | } 79 | 80 | return $return; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/FrenchCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'fr', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/GeorgianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'ka', $currency); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/GermanCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 31 | ->withWordsSeparatedBy(' ') 32 | ->transformNumbersBySplittingIntoPowerAwareTriplets($numberToTripletsConverter, $tripletTransformer) 33 | ->inflectExponentByNumbers($exponentInflector) 34 | ->build(); 35 | 36 | $decimal = (int)($amount / 100); 37 | $fraction = abs($amount % 100); 38 | 39 | if ($fraction === 0) { 40 | $fraction = null; 41 | } 42 | 43 | $currency = strtoupper($currency); 44 | 45 | if (!array_key_exists($currency, GermanDictionary::$currencyNames)) { 46 | throw new NumberToWordsException( 47 | sprintf('Currency "%s" is not available for "%s" language', $currency, get_class($this)) 48 | ); 49 | } 50 | 51 | $currencyNames = GermanDictionary::$currencyNames[$currency]; 52 | 53 | $return = trim($numberTransformer->toWords($decimal)); 54 | $level = ($decimal === 1) ? 0 : 1; 55 | 56 | if ($level > 0) { 57 | if (count($currencyNames[0]) > 1) { 58 | $return .= ' ' . $currencyNames[0][$level]; 59 | } else { 60 | $return .= ' ' . $currencyNames[0][0]; 61 | } 62 | } else { 63 | $return .= ' ' . $currencyNames[0][0]; 64 | } 65 | 66 | if (null !== $fraction) { 67 | $return .= ' ' . $dictionary::$and . ' '; 68 | 69 | $return .= trim($numberTransformer->toWords($fraction)); 70 | 71 | $level = $fraction === 1 ? 0 : 1; 72 | 73 | if ($level > 0) { 74 | if (count($currencyNames[1]) > 1) { 75 | $return .= ' ' . $currencyNames[1][$level]; 76 | } else { 77 | $return .= ' ' . $currencyNames[1][0]; 78 | } 79 | } else { 80 | $return .= ' ' . $currencyNames[1][0]; 81 | } 82 | } 83 | 84 | return $return; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/HungarianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'hu', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/LatvianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | toWords($decimal)); 40 | $level = $this->getLevel($decimal); 41 | 42 | $return .= ' ' . $currencyNames[0][$level]; 43 | 44 | if (!is_null($fraction)) { 45 | $return .= ' ' . $dictionary->getAnd() . ' ' . trim($numberTransformer->toWords($fraction)); 46 | 47 | $level = $this->getLevel($fraction); 48 | 49 | $return .= ' ' . $currencyNames[1][$level]; 50 | } else { 51 | $level = 1; 52 | 53 | $return .= ' ' . $dictionary->getAnd() . ' ' . $dictionary->getZero() . ' ' . $currencyNames[1][$level]; 54 | } 55 | 56 | return $return; 57 | } 58 | 59 | /** 60 | * @param $number 61 | * @return int 62 | */ 63 | public function getLevel($number) 64 | { 65 | $lastTwoDigits = $number % 100; 66 | $lastDigit = $number % 10; 67 | $isUnit = log($number) === 1; 68 | 69 | if ($number === 0) { 70 | return 1; 71 | } 72 | 73 | if (!$isUnit && $lastDigit === 0) { 74 | return 1; 75 | } 76 | 77 | if (10 <= $lastTwoDigits && $lastTwoDigits <= 20) { 78 | return 1; 79 | } 80 | 81 | if ($number === 1) { 82 | return 0; 83 | } 84 | 85 | if (!$isUnit && $lastDigit === 1) { 86 | return 0; 87 | } 88 | 89 | return 2; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/LithuanianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | toWords($decimal)); 40 | $level = $this->getLevel($decimal); 41 | 42 | $return .= ' ' . $currencyNames[0][$level]; 43 | 44 | if (!is_null($fraction)) { 45 | $return .= ' ' . $dictionary->getAnd() . ' ' . trim($numberTransformer->toWords($fraction)); 46 | 47 | $level = $this->getLevel($fraction); 48 | 49 | $return .= ' ' . $currencyNames[1][$level]; 50 | } else { 51 | $level = 1; 52 | 53 | $return .= ' ' . $dictionary->getAnd() . ' ' . $dictionary->getZero() . ' ' . $currencyNames[1][$level]; 54 | } 55 | 56 | return $return; 57 | } 58 | 59 | /** 60 | * @param $number 61 | * @return int 62 | */ 63 | public function getLevel($number) 64 | { 65 | $lastTwoDigits = $number % 100; 66 | $lastDigit = $number % 10; 67 | $isUnit = log($number) === 1; 68 | 69 | if ($number === 0) { 70 | return 1; 71 | } 72 | 73 | if (!$isUnit && $lastDigit === 0) { 74 | return 1; 75 | } 76 | 77 | if (10 <= $lastTwoDigits && $lastTwoDigits <= 20) { 78 | return 1; 79 | } 80 | 81 | if ($number === 1) { 82 | return 0; 83 | } 84 | 85 | if (!$isUnit && $lastDigit === 1) { 86 | return 0; 87 | } 88 | 89 | return 2; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/PolishCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 31 | ->withWordsSeparatedBy(' ') 32 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 33 | ->inflectExponentByNumbers($exponentInflector) 34 | ->build(); 35 | 36 | $decimal = (int) ($amount / 100); 37 | $fraction = abs($amount % 100); 38 | 39 | if ($fraction === 0) { 40 | $fraction = null; 41 | } 42 | 43 | $currency = strtoupper($currency); 44 | 45 | if (!array_key_exists($currency, PolishDictionary::$currencyNames)) { 46 | throw new NumberToWordsException( 47 | sprintf('Currency "%s" is not available for "%s" language', $currency, get_class($this)) 48 | ); 49 | } 50 | 51 | $currencyNames = PolishDictionary::$currencyNames[$currency]; 52 | 53 | $words = []; 54 | 55 | $words[] = $numberTransformer->toWords($decimal); 56 | $words[] = $nounGenderInflector->inflectNounByNumber( 57 | $decimal, 58 | $currencyNames[0][0], 59 | $currencyNames[0][1], 60 | $currencyNames[0][2] 61 | ); 62 | 63 | if (null !== $fraction) { 64 | $words[] = $numberTransformer->toWords($fraction); 65 | $words[] = $nounGenderInflector->inflectNounByNumber( 66 | $fraction, 67 | $currencyNames[1][0], 68 | $currencyNames[1][1], 69 | $currencyNames[1][2] 70 | ); 71 | } 72 | 73 | return implode(' ', $words); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/PortugueseBrazilianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'pt_BR', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/RomanianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'ro', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/RussianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'ru', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/SlovakCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 31 | ->withWordsSeparatedBy(' ') 32 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 33 | ->inflectExponentByNumbers($exponentInflector) 34 | ->build(); 35 | 36 | $decimal = (int) ($amount / 100); 37 | $fraction = $amount % 100; 38 | 39 | if ($fraction === 0) { 40 | $fraction = null; 41 | } 42 | 43 | $currency = strtoupper($currency); 44 | 45 | if (!array_key_exists($currency, SlovakDictionary::$currencyNames)) { 46 | throw new NumberToWordsException( 47 | sprintf('Currency "%s" is not available for "%s" language', $currency, get_class($this)) 48 | ); 49 | } 50 | 51 | $currencyNames = SlovakDictionary::$currencyNames[$currency]; 52 | 53 | $words = []; 54 | 55 | $words[] = $numberTransformer->toWords($decimal); 56 | $words[] = $nounGenderInflector->inflectNounByNumber( 57 | $decimal, 58 | $currencyNames[0][0], 59 | $currencyNames[0][1], 60 | $currencyNames[0][2] 61 | ); 62 | 63 | if (null !== $fraction) { 64 | $words[] = $numberTransformer->toWords($fraction); 65 | $words[] = $nounGenderInflector->inflectNounByNumber( 66 | $fraction, 67 | $currencyNames[1][0], 68 | $currencyNames[1][1], 69 | $currencyNames[1][2] 70 | ); 71 | } 72 | 73 | return implode(' ', $words); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/SpanishCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'es', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/TurkishCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'tr', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/TurkmenCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'tk', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/UkrainianCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'ua', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/CurrencyTransformer/YorubaCurrencyTransformer.php: -------------------------------------------------------------------------------- 1 | transformToCurrency($amount, 'yo', $currency); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Exception/NumberToWordsException.php: -------------------------------------------------------------------------------- 1 | numberTransformer = $numberTransformer; 28 | 29 | return $this; 30 | } 31 | 32 | /** 33 | * @param Dictionary $dictionary 34 | * 35 | * @return $this 36 | */ 37 | public function withDictionary(Dictionary $dictionary) 38 | { 39 | $this->dictionary = $dictionary; 40 | 41 | return $this; 42 | } 43 | 44 | public function toWords($currency, $decimal, $fraction) 45 | { 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/Grammar/Form.php: -------------------------------------------------------------------------------- 1 | [['lek'], ['qindarka']], 45 | 'AUD' => [['Australian dollar'], ['cent']], 46 | 'BAM' => [['convertible marka'], ['fenig']], 47 | 'BGN' => [['lev'], ['stotinka']], 48 | 'BRL' => [['real'], ['centavos']], 49 | 'BYR' => [['Belarussian rouble'], ['kopiejka']], 50 | 'CAD' => [['Canadian dollar'], ['cent']], 51 | 'CHF' => [['Swiss franc'], ['rapp']], 52 | 'CYP' => [['Cypriot pound'], ['cent']], 53 | 'CZK' => [['Czech koruna'], ['halerz']], 54 | 'DKK' => [['Danish krone'], ['ore']], 55 | 'DZD' => [['dinar'], ['cent']], 56 | 'EEK' => [['kroon'], ['senti']], 57 | 'EUR' => [['euro'], ['euro-cent']], 58 | 'GBP' => [['pound', 'pounds'], ['pence', 'pence']], 59 | 'HKD' => [['Hong Kong dollar'], ['cent']], 60 | 'HRK' => [['Croatian kuna'], ['lipa']], 61 | 'HUF' => [['forint'], ['filler']], 62 | 'ILS' => [['new sheqel', 'new sheqels'], ['agora', 'agorot']], 63 | 'ISK' => [['Icelandic króna'], ['aurar']], 64 | 'JPY' => [['yen'], ['sen']], 65 | 'LTL' => [['litas'], ['cent']], 66 | 'LVL' => [['lat'], ['sentim']], 67 | 'LYD' => [['dinar'], ['cent']], 68 | 'MAD' => [['dirham'], ['cent']], 69 | 'MKD' => [['Macedonian dinar'], ['deni']], 70 | 'MRO' => [['ouguiya'], ['khoums']], 71 | 'MTL' => [['Maltese lira'], ['centym']], 72 | 'NGN' => [['Naira'], ['kobo']], 73 | 'NOK' => [['Norwegian krone'], ['oere']], 74 | 'PHP' => [['peso'], ['centavo']], 75 | 'PLN' => [['zloty', 'zlotys'], ['grosz']], 76 | 'ROL' => [['Romanian leu'], ['bani']], 77 | 'RUB' => [['Russian Federation rouble'], ['kopiejka']], 78 | 'SEK' => [['Swedish krona'], ['oere']], 79 | 'SIT' => [['Tolar'], ['stotinia']], 80 | 'SKK' => [['Slovak koruna'], []], 81 | 'TMT' => [['manat'], ['tenge']], 82 | 'TND' => [['dinar'], ['cent']], 83 | 'TRL' => [['lira'], ['kuruş']], 84 | 'UAH' => [['hryvna'], ['cent']], 85 | 'USD' => [['dollar'], ['cent']], 86 | 'XAF' => [['CFA franc'], ['cent']], 87 | 'XOF' => [['CFA franc'], ['cent']], 88 | 'XPF' => [['CFP franc'], ['centime']], 89 | 'YUM' => [['dinar'], ['para']], 90 | 'ZAR' => [['rand'], ['cent']], 91 | ]; 92 | 93 | /** 94 | * @return string 95 | */ 96 | public function getZero() 97 | { 98 | return 'zero'; 99 | } 100 | 101 | /** 102 | * @return string 103 | */ 104 | public function getMinus() 105 | { 106 | return 'minus'; 107 | } 108 | 109 | /** 110 | * @param int $unit 111 | * 112 | * @return string 113 | */ 114 | public function getCorrespondingUnit($unit) 115 | { 116 | return self::$units[$unit]; 117 | } 118 | 119 | /** 120 | * @param int $ten 121 | * 122 | * @return string 123 | */ 124 | public function getCorrespondingTen($ten) 125 | { 126 | return self::$tens[$ten]; 127 | } 128 | 129 | /** 130 | * @param int $teen 131 | * 132 | * @return string 133 | */ 134 | public function getCorrespondingTeen($teen) 135 | { 136 | return self::$teens[$teen]; 137 | } 138 | 139 | /** 140 | * @param int $hundred 141 | * 142 | * @return string 143 | */ 144 | public function getCorrespondingHundred($hundred) 145 | { 146 | return self::$units[$hundred] . self::$hundred; 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /src/Language/Albanian/AlbanianExponentGetter.php: -------------------------------------------------------------------------------- 1 | dictionary = $dictionary; 20 | } 21 | 22 | /** 23 | * @param int $number 24 | * 25 | * @return string 26 | */ 27 | public function transformToWords($number) 28 | { 29 | $units = $number % 10; 30 | $tens = (int) ($number / 10) % 10; 31 | $hundreds = (int) ($number / 100) % 10; 32 | $words = []; 33 | 34 | if ($hundreds > 0) { 35 | $words[] = $this->dictionary->getCorrespondingHundred($hundreds); 36 | } 37 | 38 | if ($tens !== 0 || $units !== 0) { 39 | $words[] = $this->getSubHundred($tens, $units); 40 | } 41 | 42 | return implode(' e ', $words); 43 | } 44 | 45 | /** 46 | * @param int $tens 47 | * @param int $units 48 | * 49 | * @return string 50 | */ 51 | private function getSubHundred($tens, $units) 52 | { 53 | $words = []; 54 | 55 | if ($tens === 1) { 56 | $words[] = $this->dictionary->getCorrespondingTeen($units); 57 | } else { 58 | if ($tens > 0) { 59 | $words[] = $this->dictionary->getCorrespondingTen($tens); 60 | } 61 | if ($units > 0) { 62 | $words[] = $this->dictionary->getCorrespondingUnit($units); 63 | } 64 | } 65 | 66 | return implode(' e ', $words); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/Language/Dictionary.php: -------------------------------------------------------------------------------- 1 | [['lek'], ['qindarka']], 45 | 'AUD' => [['Australian dollar'], ['cent']], 46 | 'BAM' => [['convertible marka'], ['fenig']], 47 | 'BGN' => [['lev'], ['stotinka']], 48 | 'BRL' => [['real'], ['centavos']], 49 | 'BYR' => [['Belarussian rouble'], ['kopiejka']], 50 | 'CAD' => [['Canadian dollar'], ['cent']], 51 | 'CHF' => [['Swiss franc'], ['rapp']], 52 | 'CYP' => [['Cypriot pound'], ['cent']], 53 | 'CZK' => [['Czech koruna'], ['halerz']], 54 | 'DKK' => [['Danish krone'], ['ore']], 55 | 'DZD' => [['dinar'], ['cent']], 56 | 'EEK' => [['kroon'], ['senti']], 57 | 'EUR' => [['euro'], ['euro-cent']], 58 | 'GBP' => [['pound', 'pounds'], ['pence', 'pence']], 59 | 'HKD' => [['Hong Kong dollar'], ['cent']], 60 | 'HRK' => [['Croatian kuna'], ['lipa']], 61 | 'HUF' => [['forint'], ['filler']], 62 | 'ILS' => [['new sheqel', 'new sheqels'], ['agora', 'agorot']], 63 | 'ISK' => [['Icelandic króna'], ['aurar']], 64 | 'JPY' => [['yen'], ['sen']], 65 | 'LTL' => [['litas'], ['cent']], 66 | 'LVL' => [['lat'], ['sentim']], 67 | 'LYD' => [['dinar'], ['cent']], 68 | 'MAD' => [['dirham'], ['cent']], 69 | 'MKD' => [['Macedonian dinar'], ['deni']], 70 | 'MRO' => [['ouguiya'], ['khoums']], 71 | 'MTL' => [['Maltese lira'], ['centym']], 72 | 'NGN' => [['Naira'], ['kobo']], 73 | 'NOK' => [['Norwegian krone'], ['oere']], 74 | 'PHP' => [['peso'], ['centavo']], 75 | 'PLN' => [['zloty', 'zlotys'], ['grosz']], 76 | 'ROL' => [['Romanian leu'], ['bani']], 77 | 'RUB' => [['Russian Federation rouble'], ['kopiejka']], 78 | 'SEK' => [['Swedish krona'], ['oere']], 79 | 'SIT' => [['Tolar'], ['stotinia']], 80 | 'SKK' => [['Slovak koruna'], []], 81 | 'TMT' => [['manat'], ['tenge']], 82 | 'TND' => [['dinar'], ['cent']], 83 | 'TRL' => [['lira'], ['kuruş']], 84 | 'UAH' => [['hryvna'], ['cent']], 85 | 'USD' => [['dollar'], ['cent']], 86 | 'XAF' => [['CFA franc'], ['cent']], 87 | 'XOF' => [['CFA franc'], ['cent']], 88 | 'XPF' => [['CFP franc'], ['centime']], 89 | 'YUM' => [['dinar'], ['para']], 90 | 'ZAR' => [['rand'], ['cent']], 91 | ]; 92 | 93 | /** 94 | * @return string 95 | */ 96 | public function getZero() 97 | { 98 | return 'zero'; 99 | } 100 | 101 | /** 102 | * @return string 103 | */ 104 | public function getMinus() 105 | { 106 | return 'minus'; 107 | } 108 | 109 | /** 110 | * @param int $unit 111 | * 112 | * @return string 113 | */ 114 | public function getCorrespondingUnit($unit) 115 | { 116 | return self::$units[$unit]; 117 | } 118 | 119 | /** 120 | * @param int $ten 121 | * 122 | * @return string 123 | */ 124 | public function getCorrespondingTen($ten) 125 | { 126 | return self::$tens[$ten]; 127 | } 128 | 129 | /** 130 | * @param int $teen 131 | * 132 | * @return string 133 | */ 134 | public function getCorrespondingTeen($teen) 135 | { 136 | return self::$teens[$teen]; 137 | } 138 | 139 | /** 140 | * @param int $hundred 141 | * 142 | * @return string 143 | */ 144 | public function getCorrespondingHundred($hundred) 145 | { 146 | return self::$units[$hundred] . ' ' . self::$hundred; 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /src/Language/English/EnglishExponentGetter.php: -------------------------------------------------------------------------------- 1 | dictionary = $dictionary; 20 | } 21 | 22 | /** 23 | * @param int $number 24 | * 25 | * @return string 26 | */ 27 | public function transformToWords($number) 28 | { 29 | $units = $number % 10; 30 | $tens = (int) ($number / 10) % 10; 31 | $hundreds = (int) ($number / 100) % 10; 32 | $words = []; 33 | 34 | if ($hundreds > 0) { 35 | $words[] = $this->dictionary->getCorrespondingHundred($hundreds); 36 | } 37 | 38 | if ($tens !== 0 || $units !== 0) { 39 | $words[] = $this->getSubHundred($tens, $units); 40 | } 41 | 42 | return implode(' ', $words); 43 | } 44 | 45 | /** 46 | * @param int $tens 47 | * @param int $units 48 | * 49 | * @return string 50 | */ 51 | private function getSubHundred($tens, $units) 52 | { 53 | $words = []; 54 | 55 | if ($tens === 1) { 56 | $words[] = $this->dictionary->getCorrespondingTeen($units); 57 | } else { 58 | if ($tens > 0) { 59 | $words[] = $this->dictionary->getCorrespondingTen($tens); 60 | } 61 | if ($units > 0) { 62 | $words[] = $this->dictionary->getCorrespondingUnit($units); 63 | } 64 | } 65 | 66 | return implode('-', $words); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/Language/ExponentGetter.php: -------------------------------------------------------------------------------- 1 | 'dix', 13 | 11 => 'onze', 14 | 12 => 'douze', 15 | 13 => 'treize', 16 | 14 => 'quatorze', 17 | 15 => 'quinze', 18 | 16 => 'seize', 19 | 20 => 'vingt', 20 | 30 => 'trente', 21 | 40 => 'quarante', 22 | 50 => 'cinquante', 23 | 60 => 'soixante', 24 | 70 => 'septante', 25 | 90 => 'nonante', 26 | 100 => 'cent' 27 | ]; 28 | 29 | public static $digits = [ 30 | 1 => 'un', 31 | 2 => 'deux', 32 | 3 => 'trois', 33 | 4 => 'quatre', 34 | 5 => 'cinq', 35 | 6 => 'six', 36 | 7 => 'sept', 37 | 8 => 'huit', 38 | 9 => 'neuf' 39 | ]; 40 | 41 | public static $zero = 'zéro'; 42 | public static $and = 'et'; 43 | public static $wordSeparator = ' '; 44 | public static $dash = '-'; 45 | public static $minus = 'moins'; 46 | public static $pluralSuffix = 's'; 47 | 48 | public static $exponent = [ 49 | 0 => '', 50 | 3 => 'mille', 51 | 6 => 'million', 52 | 9 => 'milliard', 53 | 12 => 'trillion', 54 | 15 => 'quadrillion', 55 | 18 => 'quintillion', 56 | 21 => 'sextillion', 57 | 24 => 'septillion', 58 | 27 => 'octillion', 59 | 30 => 'nonillion', 60 | 33 => 'decillion', 61 | 36 => 'undecillion', 62 | 39 => 'duodecillion', 63 | 42 => 'tredecillion', 64 | 45 => 'quattuordecillion', 65 | 48 => 'quindecillion', 66 | 51 => 'sexdecillion', 67 | 54 => 'septendecillion', 68 | 57 => 'octodecillion', 69 | 60 => 'novemdecillion', 70 | 63 => 'vigintillion', 71 | 66 => 'unvigintillion', 72 | 69 => 'duovigintillion', 73 | 72 => 'trevigintillion', 74 | 75 => 'quattuorvigintillion', 75 | 78 => 'quinvigintillion', 76 | 81 => 'sexvigintillion', 77 | 84 => 'septenvigintillion', 78 | 87 => 'octovigintillion', 79 | 90 => 'novemvigintillion', 80 | ]; 81 | } 82 | -------------------------------------------------------------------------------- /src/Language/German/GermanDictionary.php: -------------------------------------------------------------------------------- 1 | 'null', 15 | 1 => 'ein', 16 | 2 => 'zwei', 17 | 3 => 'drei', 18 | 4 => 'vier', 19 | 5 => 'fünf', 20 | 6 => 'sechs', 21 | 7 => 'sieben', 22 | 8 => 'acht', 23 | 9 => 'neun' 24 | ]; 25 | 26 | private static $teens = [ 27 | 0 => 'zehn', 28 | 1 => 'elf', 29 | 2 => 'zwölf', 30 | 3 => 'dreizehn', 31 | 4 => 'vierzehn', 32 | 5 => 'fünfzehn', 33 | 6 => 'sechzehn', 34 | 7 => 'siebzehn', 35 | 8 => 'achtzehn', 36 | 9 => 'neunzehn' 37 | ]; 38 | 39 | private static $tens = [ 40 | 0 => '', 41 | 1 => 'zehn', 42 | 2 => 'zwanzig', 43 | 3 => 'dreißig', 44 | 4 => 'vierzig', 45 | 5 => 'fünfzig', 46 | 6 => 'sechzig', 47 | 7 => 'siebzig', 48 | 8 => 'achtzig', 49 | 9 => 'neunzig' 50 | ]; 51 | 52 | private static $hundreds = [ 53 | 0 => 'nullhundert', 54 | 1 => 'einhundert', 55 | 2 => 'zweihundert', 56 | 3 => 'dreihundert', 57 | 4 => 'vierhundert', 58 | 5 => 'fünfhundert', 59 | 6 => 'sechshundert', 60 | 7 => 'siebenhundert', 61 | 8 => 'achthundert', 62 | 9 => 'neunhundert' 63 | ]; 64 | 65 | public static $exponent = [ 66 | ['', ''], 67 | ['tausend', 'tausend'], 68 | ['Million', 'Millionen'], 69 | ['Milliarde', 'Milliarden'], 70 | ['Billion', 'Billionen'], 71 | ['Billiarde', 'Billiarden'], 72 | ['Trillion', 'Trillionen'], 73 | ['Trilliarde', 'Trilliarden'], 74 | ['Quadrillion', 'Quadrillionen'], 75 | ['Quadrilliarde', 'Quadrilliarden'], 76 | ['Quintillion', 'Quintillionen'], 77 | ['Quintilliarde', 'Quintilliarden'], 78 | ['Sextillion', 'Sextillionen'], 79 | ['Sextilliarde', 'Sextilliarden'], 80 | ['Septillion', 'Septillionen'], 81 | ['Septilliarde', 'Septilliarden'], 82 | ['Oktillion', 'Oktillionen'], // oder Octillionen 83 | ['Oktilliarde', 'Oktilliarden'], 84 | ['Nonillion', 'Nonillionen'], 85 | ['Nonilliarde', 'Nonilliarden'], 86 | ['Dezillion', 'Dezillionen'], 87 | ['Dezilliarde', 'Dezilliarden'], 88 | ]; 89 | 90 | public static $currencyNames = [ 91 | 'ALL' => [['Lek'], ['Quindarka']], 92 | 'AUD' => [['Australischer Dollar'], ['cent']], 93 | 'BAM' => [['Konvertible Mark'], ['Fening']], 94 | 'BGN' => [['Lew'], ['Stotinki']], 95 | 'BRL' => [['Real'], ['centavos']], 96 | 'BYR' => [['Weißrussischer Rubel'], ['Kopeke','Kopeken']], 97 | 'CAD' => [['Kanadischer Dollar'], ['cent']], 98 | 'CHF' => [['Schweizer Franken'], ['Rappen']], 99 | 'CZK' => [['Tschechische Krone','Tschechische Kronen'], ['Haleru']], 100 | 'DKK' => [['Dänische Krone','Dänische Kronen'], ['Øre']], 101 | 'EUR' => [['Euro'], ['cent']], 102 | 'GBP' => [['Pfund Sterling'], ['Pence']], 103 | 'HKD' => [['Hong Kong Dollar'], ['cent']], 104 | 'HRK' => [['Kuna'], ['lipa']], 105 | 'HUF' => [['Forint'], ['filler']], 106 | 'ILS' => [['Neuer Israel Schekel'], ['agora', 'agorot']], 107 | 'ISK' => [['isländische Krone','isländische Kronen'], ['aurar']], 108 | 'JPY' => [['Yen'], ['sen']], 109 | 'MKD' => [['Mazedonischer Denar'], ['deni']], 110 | 'NOK' => [['Norwegische Krone','Norwegische Kronen'], ['Øre']], 111 | 'PLN' => [['Złoty'], ['Groschen']], 112 | 'RUB' => [['Russischer Rubel'], ['Kopeke','Kopeken']], 113 | 'SEK' => [['Schwedische Krone','Schwedische Kronen'], ['Öre']], 114 | 'TMT' => [['Manat'], ['tenge']], 115 | 'UAH' => [['Hrywna'], ['Kopeke','Kopeken']], 116 | 'USD' => [['US Dollar'], ['cent']], 117 | 'ZAR' => [['Rand'], ['cent']] 118 | ]; 119 | 120 | public static $and = 'und'; 121 | 122 | /** 123 | * @return string 124 | */ 125 | public function getMinus() 126 | { 127 | return 'Minus'; 128 | } 129 | 130 | /** 131 | * @return string 132 | */ 133 | public function getZero() 134 | { 135 | return 'null'; 136 | } 137 | 138 | /** 139 | * @param int $unit 140 | * 141 | * @return string 142 | */ 143 | public function getCorrespondingUnit($unit) 144 | { 145 | return self::$units[$unit]; 146 | } 147 | 148 | /** 149 | * @param int $ten 150 | * 151 | * @return string 152 | */ 153 | public function getCorrespondingTen($ten) 154 | { 155 | return self::$tens[$ten]; 156 | } 157 | 158 | /** 159 | * @param int $teen 160 | * 161 | * @return string 162 | */ 163 | public function getCorrespondingTeen($teen) 164 | { 165 | return self::$teens[$teen]; 166 | } 167 | 168 | /** 169 | * @param int $hundred 170 | * 171 | * @return string 172 | */ 173 | public function getCorrespondingHundred($hundred) 174 | { 175 | return self::$hundreds[$hundred]; 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /src/Language/German/GermanExponentInflector.php: -------------------------------------------------------------------------------- 1 | dictionary = $dictionary; 21 | } 22 | 23 | /** 24 | * @param int $number 25 | * @param int $power 26 | * 27 | * @return string 28 | */ 29 | public function transformToWords($number, $power) 30 | { 31 | $units = $number % 10; 32 | $tens = (int) ($number / 10) % 10; 33 | $hundreds = (int) ($number / 100) % 10; 34 | $words = []; 35 | 36 | if ($hundreds > 0) { 37 | $words[] = $this->dictionary->getCorrespondingHundred($hundreds); 38 | } 39 | 40 | if ($tens === 1) { 41 | $words[] = $this->dictionary->getCorrespondingTeen($units); 42 | } 43 | 44 | if ($units > 0 && $tens !== 1) { 45 | $words[] = $this->dictionary->getCorrespondingUnit($units); 46 | 47 | if ($tens > 1) { 48 | $words[] = 'und'; 49 | } elseif ($units === 1) { 50 | if ($power === 0) { 51 | $words[] = 's'; 52 | } elseif ($power !== 1) { 53 | $words[] = 'e'; 54 | } 55 | } 56 | } 57 | 58 | if ($tens > 1) { 59 | $words[] = $this->dictionary->getCorrespondingTen($tens); 60 | } 61 | 62 | return implode('', $words); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/Language/Latvian/LatvianDictionary.php: -------------------------------------------------------------------------------- 1 | '', 15 | 1 => 'viens', 16 | 2 => 'divi', 17 | 3 => 'trīs', 18 | 4 => 'četri', 19 | 5 => 'pieci', 20 | 6 => 'seši', 21 | 7 => 'septiņi', 22 | 8 => 'astoņi', 23 | 9 => 'deviņi' 24 | ]; 25 | 26 | private static $teens = [ 27 | 0 => 'desmit', 28 | 1 => 'vienpadsmit', 29 | 2 => 'divpadsmit', 30 | 3 => 'trīspadsmit', 31 | 4 => 'četrpadsmit', 32 | 5 => 'piecpadsmit', 33 | 6 => 'sešpadsmit', 34 | 7 => 'septiņpadsmit', 35 | 8 => 'astoņpadsmit', 36 | 9 => 'deviņpadsmit' 37 | ]; 38 | 39 | private static $tens = [ 40 | 0 => '', 41 | 1 => 'desmit', 42 | 2 => 'divdesmit', 43 | 3 => 'trīsdesmit', 44 | 4 => 'četrdesmit', 45 | 5 => 'piecdesmit', 46 | 6 => 'sešdesmit', 47 | 7 => 'septiņdesmit', 48 | 8 => 'astoņdesmit', 49 | 9 => 'deviņdesmit' 50 | ]; 51 | 52 | /** @var array> */ 53 | public static $currencyNames = [ 54 | 'EUR' => [['eiro', 'eiro', 'eiro'], ['eiro cents', 'eiro centi', 'eiro centi']], 55 | 'USD' => [['dolārs', 'dolāri', 'dolāri'], ['cents', 'centi', 'centi']], 56 | ]; 57 | 58 | /** 59 | * @return string 60 | */ 61 | public function getAnd() 62 | { 63 | return 'un'; 64 | } 65 | 66 | /** 67 | * @return string 68 | */ 69 | public function getZero() 70 | { 71 | return 'nulle'; 72 | } 73 | 74 | /** 75 | * @return string 76 | */ 77 | public function getMinus() 78 | { 79 | return 'minus'; 80 | } 81 | 82 | /** 83 | * @param int $unit 84 | * 85 | * @return string 86 | */ 87 | public function getCorrespondingUnit($unit) 88 | { 89 | return self::$units[$unit]; 90 | } 91 | 92 | /** 93 | * @param int $ten 94 | * 95 | * @return string 96 | */ 97 | public function getCorrespondingTen($ten) 98 | { 99 | return self::$tens[$ten]; 100 | } 101 | 102 | /** 103 | * @param int $teen 104 | * 105 | * @return string 106 | */ 107 | public function getCorrespondingTeen($teen) 108 | { 109 | return self::$teens[$teen]; 110 | } 111 | 112 | /** 113 | * @param int $hundred 114 | * 115 | * @return string 116 | */ 117 | public function getCorrespondingHundred($hundred) 118 | { 119 | if ($hundred === 1) { 120 | return 'simts'; 121 | } 122 | 123 | return self::$units[$hundred] . ' simti'; 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/Language/Latvian/LatvianExponentInflector.php: -------------------------------------------------------------------------------- 1 | 0 && $units === 0)) { 32 | return $level[2]; 33 | } elseif ($units > 1) { 34 | return $level[1]; 35 | } else { 36 | return $level[0]; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/Language/Latvian/LatvianTripletTransformer.php: -------------------------------------------------------------------------------- 1 | dictionary = $latvianDictionary; 20 | } 21 | 22 | /** 23 | * @param int $number 24 | * 25 | * @return string 26 | */ 27 | public function transformToWords($number) 28 | { 29 | $units = $number % 10; 30 | $tens = (int) ($number / 10) % 10; 31 | $hundreds = (int) ($number / 100) % 10; 32 | $words = []; 33 | 34 | if ($hundreds > 0) { 35 | $words[] = $this->dictionary->getCorrespondingHundred($hundreds); 36 | } 37 | 38 | if ($tens === 1) { 39 | $words[] = $this->dictionary->getCorrespondingTeen($units); 40 | } 41 | 42 | if ($tens > 1) { 43 | $words[] = $this->dictionary->getCorrespondingTen($tens); 44 | } 45 | 46 | if ($units > 0 && $tens !== 1) { 47 | $words[] = $this->dictionary->getCorrespondingUnit($units); 48 | } 49 | 50 | return implode(' ', $words); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/Language/Lithuania/LithuaniaDictionary.php: -------------------------------------------------------------------------------- 1 | */ 14 | private static $units = [ 15 | 0 => 'nulis', 16 | 1 => 'vienas', 17 | 2 => 'du', 18 | 3 => 'trys', 19 | 4 => 'keturi', 20 | 5 => 'penki', 21 | 6 => 'šeši', 22 | 7 => 'septyni', 23 | 8 => 'aštuoni', 24 | 9 => 'devyni' 25 | ]; 26 | 27 | /** @var array */ 28 | private static $tens = [ 29 | 0 => 'dešimt', 30 | 1 => 'vienuolika', 31 | 2 => 'dvylika', 32 | 3 => 'trylika', 33 | 4 => 'keturiolika', 34 | 5 => 'penkiolika', 35 | 6 => 'šešiolika', 36 | 7 => 'septyniolika', 37 | 8 => 'aštuoniolika', 38 | 9 => 'devyniolika' 39 | ]; 40 | 41 | /** @var array */ 42 | private static $teens = [ 43 | 0 => '', 44 | 1 => 'dešimt', 45 | 2 => 'dvidešimt', 46 | 3 => 'trisdešimt', 47 | 4 => 'keturiasdešimt', 48 | 5 => 'penkiasdešimt', 49 | 6 => 'šešiasdešimt', 50 | 7 => 'septyniasdešimt', 51 | 8 => 'aštuoniasdešimt', 52 | 9 => 'devyniasdešimt' 53 | ]; 54 | 55 | /** @var array */ 56 | private static $hundreds = [ 57 | 0 => 'šimtas', 58 | 2 => 'šimtai', 59 | ]; 60 | 61 | /** @var array> */ 62 | public static $exponent = [ 63 | ['', ''], 64 | ['tūkstantis', 'tūkstančių', 'tūkstančiai'], 65 | ['milijonas', 'milijonų', 'milijonai'], 66 | ['bilijonas', 'bilijonų', 'bilijonai'], 67 | ['trilijonas', 'trilijonų', 'trilijardai'], 68 | ['kvadrilijonas', 'kvadrilijonų', 'kvadrilijonai'], 69 | ['kvintilijonas', 'kvintilijonų', 'kvintilijonai'], 70 | ['sikstilijonas', 'sikstilijonų', 'sikstilijonai'], 71 | ['septilijonas', 'septilijonų', 'septilijonai'], 72 | ['oktilijonas', 'oktilijonų', 'oktilijonai'], 73 | ['nonilijonas', 'nonilijonų', 'nonilijonai'], 74 | ['gugolas', 'gugolų', 'gugolai'], 75 | ['gugolplexas', 'gugolplexų', 'gugolplexai'] 76 | ]; 77 | 78 | /** @var array> */ 79 | public static $currencyNames = [ 80 | 'EUR' => [['euras', 'eurų', 'eurai'], ['euro centas', 'euro centų', 'euro centai']], 81 | 'LT' => [['litas', 'litų', 'litai'], ['lito centas', 'lito centų', 'lito centai']], 82 | ]; 83 | 84 | /** 85 | * @return string 86 | */ 87 | public function getAnd() 88 | { 89 | return 'ir'; 90 | } 91 | 92 | /** 93 | * @return string 94 | */ 95 | public function getMinus() 96 | { 97 | return 'minus'; 98 | } 99 | 100 | /** 101 | * @return string 102 | */ 103 | public function getZero() 104 | { 105 | return 'nulis'; 106 | } 107 | 108 | /** 109 | * @param int $unit 110 | * 111 | * @return string 112 | */ 113 | public function getCorrespondingUnit($unit) 114 | { 115 | return self::$units[$unit]; 116 | } 117 | 118 | /** 119 | * @param int $ten 120 | * 121 | * @return string 122 | */ 123 | public function getCorrespondingTen($ten) 124 | { 125 | return self::$tens[$ten]; 126 | } 127 | 128 | /** 129 | * @param int $teen 130 | * 131 | * @return string 132 | */ 133 | public function getCorrespondingTeen($teen) 134 | { 135 | return self::$teens[$teen]; 136 | } 137 | 138 | /** 139 | * @param int $hundred 140 | * 141 | * @return string 142 | */ 143 | public function getCorrespondingHundred($hundred) 144 | { 145 | if ($hundred === 1) { 146 | return static::$hundreds[0]; 147 | } 148 | 149 | return self::$units[$hundred] . ' ' . static::$hundreds[1]; 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /src/Language/Persian/PersianDictionary.php: -------------------------------------------------------------------------------- 1 | [['ریال'], ['ریال']], 45 | ]; 46 | 47 | /** 48 | * @return string 49 | */ 50 | public function getZero() 51 | { 52 | return 'صفر'; 53 | } 54 | 55 | /** 56 | * @return string 57 | */ 58 | public function getMinus() 59 | { 60 | return 'منفی'; 61 | } 62 | 63 | /** 64 | * @param int $unit 65 | * 66 | * @return string 67 | */ 68 | public function getCorrespondingUnit($unit) 69 | { 70 | return self::$units[$unit]; 71 | } 72 | 73 | /** 74 | * @param int $ten 75 | * 76 | * @return string 77 | */ 78 | public function getCorrespondingTen($ten) 79 | { 80 | return self::$tens[$ten]; 81 | } 82 | 83 | /** 84 | * @param int $teen 85 | * 86 | * @return string 87 | */ 88 | public function getCorrespondingTeen($teen) 89 | { 90 | return self::$teens[$teen]; 91 | } 92 | 93 | /** 94 | * @param int $hundred 95 | * 96 | * @return string 97 | */ 98 | public function getCorrespondingHundred($hundred) 99 | { 100 | return self::$units[$hundred] . ' ' . self::$hundred; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/Language/Persian/PersianExponentGetter.php: -------------------------------------------------------------------------------- 1 | dictionary = $dictionary; 20 | } 21 | 22 | /** 23 | * @param int $number 24 | * 25 | * @return string 26 | */ 27 | public function transformToWords($number) 28 | { 29 | $units = $number % 10; 30 | $tens = (int) ($number / 10) % 10; 31 | $hundreds = (int) ($number / 100) % 10; 32 | $words = []; 33 | 34 | if ($hundreds > 0) { 35 | $words[] = $this->dictionary->getCorrespondingHundred($hundreds); 36 | } 37 | 38 | if ($tens !== 0 || $units !== 0) { 39 | $words[] = $this->getSubHundred($tens, $units); 40 | } 41 | 42 | return implode(' ', $words); 43 | } 44 | 45 | /** 46 | * @param int $tens 47 | * @param int $units 48 | * 49 | * @return string 50 | */ 51 | private function getSubHundred($tens, $units) 52 | { 53 | $words = []; 54 | 55 | if ($tens === 1) { 56 | $words[] = $this->dictionary->getCorrespondingTeen($units); 57 | } else { 58 | if ($tens > 0) { 59 | $words[] = $this->dictionary->getCorrespondingTen($tens); 60 | } 61 | if ($units > 0) { 62 | $words[] = $this->dictionary->getCorrespondingUnit($units); 63 | } 64 | } 65 | 66 | return implode('-', $words); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/Language/Polish/PolishDictionary.php: -------------------------------------------------------------------------------- 1 | '', 15 | 1 => 'jeden', 16 | 2 => 'dwa', 17 | 3 => 'trzy', 18 | 4 => 'cztery', 19 | 5 => 'pięć', 20 | 6 => 'sześć', 21 | 7 => 'siedem', 22 | 8 => 'osiem', 23 | 9 => 'dziewięć' 24 | ]; 25 | 26 | private static $teens = [ 27 | 0 => 'dziesięć', 28 | 1 => 'jedenaście', 29 | 2 => 'dwanaście', 30 | 3 => 'trzynaście', 31 | 4 => 'czternaście', 32 | 5 => 'piętnaście', 33 | 6 => 'szesnaście', 34 | 7 => 'siedemnaście', 35 | 8 => 'osiemnaście', 36 | 9 => 'dziewiętnaście' 37 | ]; 38 | 39 | private static $tens = [ 40 | 0 => '', 41 | 1 => 'dziesięć', 42 | 2 => 'dwadzieścia', 43 | 3 => 'trzydzieści', 44 | 4 => 'czterdzieści', 45 | 5 => 'pięćdziesiąt', 46 | 6 => 'sześćdziesiąt', 47 | 7 => 'siedemdziesiąt', 48 | 8 => 'osiemdziesiąt', 49 | 9 => 'dziewięćdziesiąt' 50 | ]; 51 | 52 | private static $hundreds = [ 53 | 0 => '', 54 | 1 => 'sto', 55 | 2 => 'dwieście', 56 | 3 => 'trzysta', 57 | 4 => 'czterysta', 58 | 5 => 'pięćset', 59 | 6 => 'sześćset', 60 | 7 => 'siedemset', 61 | 8 => 'osiemset', 62 | 9 => 'dziewięćset' 63 | ]; 64 | 65 | public static $currencyNames = [ 66 | 'ALL' => [['lek', 'leki', 'leków'], ['quindarka', 'quindarki', 'quindarek']], 67 | 'AUD' => [ 68 | ['dolar australijski', 'dolary australijskie', 'dolarów australijskich'], 69 | ['cent', 'centy', 'centów'] 70 | ], 71 | 'BAM' => [['marka', 'marki', 'marek'], ['fenig', 'fenigi', 'fenigów']], 72 | 'BGN' => [['lew', 'lewy', 'lew'], ['stotinka', 'stotinki', 'stotinek']], 73 | 'BRL' => [['real', 'reale', 'realów'], ['centavos', 'centavos', 'centavos']], 74 | 'BYR' => [['rubel', 'ruble', 'rubli'], ['kopiejka', 'kopiejki', 'kopiejek']], 75 | 'CAD' => [['dolar kanadyjski', 'dolary kanadyjskie', 'dolarów kanadyjskich'], ['cent', 'centy', 'centów']], 76 | 'CHF' => [['frank szwajcarski', 'franki szwajcarskie', 'franków szwajcarskich'], ['rapp', 'rappy', 'rappów']], 77 | 'CYP' => [['funt cypryjski', 'funty cypryjskie', 'funtów cypryjskich'], ['cent', 'centy', 'centów']], 78 | 'CZK' => [['korona czeska', 'korony czeskie', 'koron czeskich'], ['halerz', 'halerze', 'halerzy']], 79 | 'DKK' => [['korona duńska', 'korony duńskie', 'koron duńskich'], ['ore', 'ore', 'ore']], 80 | 'EEK' => [['korona estońska', 'korony estońskie', 'koron estońskich'], ['senti', 'senti', 'senti']], 81 | 'EUR' => [['euro', 'euro', 'euro'], ['eurocent', 'eurocenty', 'eurocentów']], 82 | 'GBP' => [['funt szterling', 'funty szterlingi', 'funtów szterlingów'], ['pens', 'pensy', 'pensów']], 83 | 'HKD' => [['dolar Hongkongu', 'dolary Hongkongu', 'dolarów Hongkongu'], ['cent', 'centy', 'centów']], 84 | 'HRK' => [['kuna', 'kuny', 'kun'], ['lipa', 'lipy', 'lip']], 85 | 'HUF' => [['forint', 'forinty', 'forintów'], ['filler', 'fillery', 'fillerów']], 86 | 'ILS' => [['nowy szekel', 'nowe szekele', 'nowych szekeli'], ['agora', 'agory', 'agorot']], 87 | 'ISK' => [['korona islandzka', 'korony islandzkie', 'koron islandzkich'], ['aurar', 'aurar', 'aurar']], 88 | 'JPY' => [['jen', 'jeny', 'jenów'], ['sen', 'seny', 'senów']], 89 | 'LTL' => [['lit', 'lity', 'litów'], ['cent', 'centy', 'centów']], 90 | 'LVL' => [['łat', 'łaty', 'łatów'], ['sentim', 'sentimy', 'sentimów']], 91 | 'MKD' => [['denar', 'denary', 'denarów'], ['deni', 'deni', 'deni']], 92 | 'MTL' => [['lira maltańska', 'liry maltańskie', 'lir maltańskich'], ['centym', 'centymy', 'centymów']], 93 | 'NOK' => [['korona norweska', 'korony norweskie', 'koron norweskich'], ['oere', 'oere', 'oere']], 94 | 'PLN' => [['złoty', 'złote', 'złotych'], ['grosz', 'grosze', 'groszy']], 95 | 'ROL' => [['lej', 'leje', 'lei'], ['bani', 'bani', 'bani']], 96 | 'RUB' => [['rubel', 'ruble', 'rubli'], ['kopiejka', 'kopiejki', 'kopiejek']], 97 | 'SEK' => [['korona szwedzka', 'korony szwedzkie', 'koron szweckich'], ['oere', 'oere', 'oere']], 98 | 'SIT' => [['tolar', 'tolary', 'tolarów'], ['stotinia', 'stotinie', 'stotini']], 99 | 'SKK' => [['korona słowacka', 'korony słowackie', 'koron słowackich'], ['halerz', 'halerze', 'halerzy']], 100 | 'TRL' => [['lira turecka', 'liry tureckie', 'lir tureckich'], ['kurusza', 'kurysze', 'kuruszy']], 101 | 'UAH' => [['hrywna', 'hrywna', 'hrywna'], ['cent', 'centy', 'centów']], 102 | 'USD' => [['dolar', 'dolary', 'dolarów'], ['cent', 'centy', 'centów']], 103 | 'YUM' => [['dinar', 'dinary', 'dinarów'], ['para', 'para', 'para']], 104 | 'ZAR' => [['rand', 'randy', 'randów'], ['cent', 'centy', 'centów']] 105 | ]; 106 | 107 | /** 108 | * @return string 109 | */ 110 | public function getMinus() 111 | { 112 | return 'minus'; 113 | } 114 | 115 | /** 116 | * @return string 117 | */ 118 | public function getZero() 119 | { 120 | return 'zero'; 121 | } 122 | 123 | /** 124 | * @param int $unit 125 | * 126 | * @return string 127 | */ 128 | public function getCorrespondingUnit($unit) 129 | { 130 | return self::$units[$unit]; 131 | } 132 | 133 | /** 134 | * @param int $ten 135 | * 136 | * @return string 137 | */ 138 | public function getCorrespondingTen($ten) 139 | { 140 | return self::$tens[$ten]; 141 | } 142 | 143 | /** 144 | * @param int $teen 145 | * 146 | * @return string 147 | */ 148 | public function getCorrespondingTeen($teen) 149 | { 150 | return self::$teens[$teen]; 151 | } 152 | 153 | /** 154 | * @param int $hundred 155 | * 156 | * @return string 157 | */ 158 | public function getCorrespondingHundred($hundred) 159 | { 160 | return self::$hundreds[$hundred]; 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /src/Language/Polish/PolishExponentInflector.php: -------------------------------------------------------------------------------- 1 | inflector = $inflector; 45 | } 46 | 47 | /** 48 | * @param int $number 49 | * @param int $power 50 | * 51 | * @return string 52 | */ 53 | public function inflectExponent($number, $power) 54 | { 55 | return $this->inflector->inflectNounByNumber( 56 | $number, 57 | self::$exponent[$power][0], 58 | self::$exponent[$power][1], 59 | self::$exponent[$power][2] 60 | ); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/Language/Polish/PolishNounGenderInflector.php: -------------------------------------------------------------------------------- 1 | 1) { 25 | return $genitivePlural; 26 | } 27 | 28 | if ($units >= 2 && $units <= 4) { 29 | return $plural; 30 | } 31 | 32 | return $genitivePlural; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Language/Polish/PolishTripletTransformer.php: -------------------------------------------------------------------------------- 1 | polishDictionary = $polishDictionary; 20 | } 21 | 22 | /** 23 | * @param int $number 24 | * 25 | * @return string 26 | */ 27 | public function transformToWords($number) 28 | { 29 | $units = $number % 10; 30 | $tens = (int) ($number / 10) % 10; 31 | $hundreds = (int) ($number / 100) % 10; 32 | $words = []; 33 | 34 | if ($hundreds > 0) { 35 | $words[] = $this->polishDictionary->getCorrespondingHundred($hundreds); 36 | } 37 | 38 | if ($tens === 1) { 39 | $words[] = $this->polishDictionary->getCorrespondingTeen($units); 40 | } 41 | 42 | if ($tens > 1) { 43 | $words[] = $this->polishDictionary->getCorrespondingTen($tens); 44 | } 45 | 46 | if ($units > 0 && $tens !== 1) { 47 | $words[] = $this->polishDictionary->getCorrespondingUnit($units); 48 | } 49 | 50 | return implode(' ', $words); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/Language/PowerAwareTripletTransformer.php: -------------------------------------------------------------------------------- 1 | '', 15 | 1 => 'jeden', 16 | 2 => 'dva', 17 | 3 => 'tri', 18 | 4 => 'štyri', 19 | 5 => 'päť', 20 | 6 => 'šesť', 21 | 7 => 'sedem', 22 | 8 => 'osem', 23 | 9 => 'deväť', 24 | ]; 25 | 26 | private static $teens = [ 27 | 0 => 'desať', 28 | 1 => 'jedenásť', 29 | 2 => 'dvanásť', 30 | 3 => 'trinásť', 31 | 4 => 'štrnásť', 32 | 5 => 'pätnásť', 33 | 6 => 'šestnásť', 34 | 7 => 'sedemnásť', 35 | 8 => 'osemnásť', 36 | 9 => 'devätnásť' 37 | ]; 38 | 39 | private static $twenteens = [ 40 | 0 => 'dvadsať', 41 | 1 => 'dvadsaťjeden', 42 | 2 => 'dvadsaťdva', 43 | 3 => 'dvadsaťtri', 44 | 4 => 'dvadsaťštyri', 45 | 5 => 'dvadsaťpäť', 46 | 6 => 'dvadsaťšesť', 47 | 7 => 'dvadsaťsedem', 48 | 8 => 'dvadsaťosem', 49 | 9 => 'dvadsaťdeväť' 50 | ]; 51 | 52 | private static $tens = [ 53 | 0 => '', 54 | 1 => 'desať', 55 | 2 => 'dvadsať', 56 | 3 => 'tridsať', 57 | 4 => 'štyridsať', 58 | 5 => 'päťdesiat', 59 | 6 => 'šesťdesiat', 60 | 7 => 'sedemdesiat', 61 | 8 => 'osemdesiat', 62 | 9 => 'deväťdesiat' 63 | ]; 64 | 65 | private static $hundreds = [ 66 | 0 => '', 67 | 1 => 'sto', 68 | 2 => 'dvesto', 69 | 3 => 'tristo', 70 | 4 => 'štyristo', 71 | 5 => 'päťsto', 72 | 6 => 'šesťsto', 73 | 7 => 'sedemsto', 74 | 8 => 'osemsto', 75 | 9 => 'deväťsto' 76 | ]; 77 | 78 | public static $currencyNames = [ 79 | 'ALL' => [['lek', 'leki', 'lekov'], ['quindarka', 'quindarki', 'quindarek']], 80 | 'AUD' => [ 81 | ['dolar australijski', 'dolary australijskie', 'dolarov australijskich'], 82 | ['cent', 'centy', 'centov'] 83 | ], 84 | 'BAM' => [['marka', 'marki', 'marek'], ['fenig', 'fenigi', 'fenigov']], 85 | 'BGN' => [['lew', 'lewy', 'lew'], ['stotinka', 'stotinki', 'stotinek']], 86 | 'BRL' => [['real', 'reale', 'realov'], ['centavos', 'centavos', 'centavos']], 87 | 'BYR' => [['rubel', 'ruble', 'rubli'], ['kopiejka', 'kopiejki', 'kopiejek']], 88 | 'CAD' => [['dolar kanadyjski', 'dolary kanadyjskie', 'dolarov kanadyjskich'], ['cent', 'centy', 'centov']], 89 | 'CHF' => [['frank szwajcarski', 'franki szwajcarskie', 'frankov szwajcarskich'], ['rapp', 'rappy', 'rappov']], 90 | 'CYP' => [['funt cypryjski', 'funty cypryjskie', 'funtov cypryjskich'], ['cent', 'centy', 'centov']], 91 | 'CZK' => [['korona czeska', 'korony czeskie', 'koron czeskich'], ['halerz', 'halerze', 'halerzy']], 92 | 'DKK' => [['korona duńska', 'korony duńskie', 'koron duńskich'], ['ore', 'ore', 'ore']], 93 | 'EEK' => [['korona estońska', 'korony estońskie', 'koron estońskich'], ['senti', 'senti', 'senti']], 94 | 'EUR' => [['euro', 'euro', 'euro'], ['eurocent', 'eurocenty', 'eurocentov']], 95 | 'GBP' => [['funt szterling', 'funty szterlingi', 'funtov szterlingov'], ['pens', 'pensy', 'pensov']], 96 | 'HKD' => [['dolar Hongkongu', 'dolary Hongkongu', 'dolarov Hongkongu'], ['cent', 'centy', 'centov']], 97 | 'HRK' => [['kuna', 'kuny', 'kun'], ['lipa', 'lipy', 'lip']], 98 | 'HUF' => [['forint', 'forinty', 'forintov'], ['filler', 'fillery', 'fillerov']], 99 | 'ILS' => [['nowy szekel', 'nowe szekele', 'nowych szekeli'], ['agora', 'agory', 'agorot']], 100 | 'ISK' => [['korona islandzka', 'korony islandzkie', 'koron islandzkich'], ['aurar', 'aurar', 'aurar']], 101 | 'JPY' => [['jen', 'jeny', 'jenov'], ['sen', 'seny', 'senov']], 102 | 'LTL' => [['lit', 'lity', 'litov'], ['cent', 'centy', 'centov']], 103 | 'LVL' => [['łat', 'łaty', 'łatov'], ['sentim', 'sentimy', 'sentimov']], 104 | 'MKD' => [['denar', 'denary', 'denarov'], ['deni', 'deni', 'deni']], 105 | 'MTL' => [['lira maltańska', 'liry maltańskie', 'lir maltańskich'], ['centym', 'centymy', 'centymov']], 106 | 'NOK' => [['korona norweska', 'korony norweskie', 'koron norweskich'], ['oere', 'oere', 'oere']], 107 | 'PLN' => [['złoty', 'złote', 'złotych'], ['grosz', 'grosze', 'groszy']], 108 | 'ROL' => [['lej', 'leje', 'lei'], ['bani', 'bani', 'bani']], 109 | 'RUB' => [['rubel', 'ruble', 'rubli'], ['kopiejka', 'kopiejki', 'kopiejek']], 110 | 'SEK' => [['korona szwedzka', 'korony szwedzkie', 'koron szweckich'], ['oere', 'oere', 'oere']], 111 | 'SIT' => [['tolar', 'tolary', 'tolarov'], ['stotinia', 'stotinie', 'stotini']], 112 | 'SKK' => [['korona słowacka', 'korony słowackie', 'koron słowackich'], ['halerz', 'halerze', 'halerzy']], 113 | 'TRL' => [['lira turecka', 'liry tureckie', 'lir tureckich'], ['kurusza', 'kurysze', 'kuruszy']], 114 | 'UAH' => [['hrivny', 'hrivny', 'hrivien'], ['cent', 'centy', 'centov']], 115 | 'USD' => [['dolár', 'doláre', 'dolárov'], ['cent', 'centy', 'centov']], 116 | 'YUM' => [['dinar', 'dinary', 'dinarov'], ['para', 'para', 'para']], 117 | 'ZAR' => [['rand', 'randy', 'randov'], ['cent', 'centy', 'centov']] 118 | ]; 119 | 120 | 121 | /** 122 | * @return string 123 | */ 124 | public function getMinus() 125 | { 126 | return 'mínus'; 127 | } 128 | 129 | /** 130 | * @return string 131 | */ 132 | public function getZero() 133 | { 134 | return 'nula'; 135 | } 136 | 137 | /** 138 | * @param int $unit 139 | * 140 | * @return string 141 | */ 142 | public function getCorrespondingUnit($unit) 143 | { 144 | return self::$units[$unit]; 145 | } 146 | 147 | /** 148 | * @param int $ten 149 | * 150 | * @return string 151 | */ 152 | public function getCorrespondingTen($ten) 153 | { 154 | return self::$tens[$ten]; 155 | } 156 | 157 | /** 158 | * @param int $teen 159 | * 160 | * @return string 161 | */ 162 | public function getCorrespondingTeen($teen) 163 | { 164 | return self::$teens[$teen]; 165 | } 166 | 167 | /** 168 | * @param int $twenteen 169 | * 170 | * @return string 171 | */ 172 | public function getCorrespondingTwenteen($twenteen) 173 | { 174 | return self::$twenteens[$twenteen]; 175 | } 176 | 177 | /** 178 | * @param int $hundred 179 | * 180 | * @return string 181 | */ 182 | public function getCorrespondingHundred($hundred) 183 | { 184 | return self::$hundreds[$hundred]; 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /src/Language/Slovak/SlovakExponentInflector.php: -------------------------------------------------------------------------------- 1 | inflector = $inflector; 46 | } 47 | 48 | /** 49 | * @param int $number 50 | * @param int $power 51 | * 52 | * @return string 53 | */ 54 | public function inflectExponent($number, $power) 55 | { 56 | return $this->inflector->inflectNounByNumber( 57 | $number, 58 | self::$exponent[$power][0], 59 | self::$exponent[$power][1], 60 | self::$exponent[$power][2] 61 | ); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/Language/Slovak/SlovakNounGenderInflector.php: -------------------------------------------------------------------------------- 1 | 1) { 25 | return $genitivePlural; 26 | } 27 | 28 | if ($units >= 2 && $units <= 4) { 29 | return $plural; 30 | } 31 | 32 | return $genitivePlural; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Language/Slovak/SlovakTripletTransformer.php: -------------------------------------------------------------------------------- 1 | slovakDictionary = $slovakDictionary; 20 | } 21 | 22 | /** 23 | * @param int $number 24 | * 25 | * @return string 26 | */ 27 | public function transformToWords($number) 28 | { 29 | $units = $number % 10; 30 | $tens = (int) ($number / 10) % 10; 31 | $hundreds = (int) ($number / 100) % 10; 32 | $words = []; 33 | if ($hundreds > 0) { 34 | $words[] = $this->slovakDictionary->getCorrespondingHundred($hundreds); 35 | } 36 | 37 | if ($tens === 1) { 38 | $words[] = $this->slovakDictionary->getCorrespondingTeen($units); 39 | } 40 | if ($tens === 2) { 41 | $words[] = $this->slovakDictionary->getCorrespondingTwenteen($units); 42 | } 43 | 44 | if ($tens > 2) { 45 | $words[] = $this->slovakDictionary->getCorrespondingTen($tens); 46 | } 47 | 48 | if ($units > 0 && $tens !== 1 && $tens !== 2) { 49 | $words[] = $this->slovakDictionary->getCorrespondingUnit($units); 50 | } 51 | 52 | return implode(' ', $words); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Language/TripletTransformer.php: -------------------------------------------------------------------------------- 1 | options = new CurrencyTransformerOptions(); 16 | } else { 17 | $this->options = $options; 18 | } 19 | } 20 | 21 | /** 22 | * @param int $number 23 | * @param string $locale 24 | * 25 | * @throws NumberToWordsException 26 | * @return string 27 | */ 28 | public function transformToWords($number, $locale): string 29 | { 30 | $localeClassName = $this->resolveLocaleClassName($locale); 31 | $transformer = new $localeClassName(); 32 | 33 | return trim($transformer->toWords($number)); 34 | } 35 | 36 | /** 37 | * @param int $amount 38 | * @param string $locale 39 | * @param string $currency 40 | * 41 | * @throws NumberToWordsException 42 | * @return string 43 | */ 44 | public function transformToCurrency($amount, $locale, $currency): string 45 | { 46 | $localeClassName = $this->resolveLocaleClassName($locale); 47 | $transformer = new $localeClassName($this->options); 48 | 49 | $decimalPart = (int) ($amount / 100); 50 | $fractionalPart = abs($amount % 100); 51 | 52 | if (0 === $fractionalPart) { 53 | return trim($transformer->toCurrencyWords($currency, $decimalPart)); 54 | } 55 | 56 | return trim($transformer->toCurrencyWords($currency, $decimalPart, $fractionalPart)); 57 | } 58 | 59 | /** 60 | * @param string $locale 61 | * 62 | * @throws NumberToWordsException 63 | * @return string 64 | */ 65 | private function resolveLocaleClassName($locale): string 66 | { 67 | $locale = implode('\\', array_map(function ($element) { 68 | return ucfirst(strtolower($element)); 69 | }, explode('_', $locale))); 70 | 71 | $class = 'CleverEggDigital\\NumberToWords\\Legacy\\Numbers\\Words\\Locale\\' . $locale; 72 | 73 | if (!class_exists($class)) { 74 | throw new NumberToWordsException(sprintf('Unable to load locale class %s', $class)); 75 | } 76 | 77 | return $class; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Fr/Be.php: -------------------------------------------------------------------------------- 1 | numberToTripletsConverter = new NumberToTripletsConverter(); 16 | } 17 | 18 | /** 19 | * @param int $number 20 | * @param bool $last 21 | * 22 | * @return string 23 | */ 24 | private function showDigitsGroup($number, $last = false) 25 | { 26 | $ret = ''; 27 | 28 | $units = $number % 10; 29 | $tens = (int) ($number / 10) % 10; 30 | $hundreds = (int) ($number / 100) % 10; 31 | 32 | if ($hundreds) { 33 | if ($hundreds > 1) { 34 | $ret .= BelgianDictionary::$digits[$hundreds] . BelgianDictionary::$wordSeparator . BelgianDictionary::$miscNumbers[100]; 35 | if ($last && !$units && !$tens) { 36 | $ret .= BelgianDictionary::$pluralSuffix; 37 | } 38 | } else { 39 | $ret .= BelgianDictionary::$miscNumbers[100]; 40 | } 41 | $ret .= BelgianDictionary::$wordSeparator; 42 | } 43 | 44 | if ($tens) { 45 | if ($tens === 1) { 46 | if ($units <= 6) { 47 | $ret .= BelgianDictionary::$miscNumbers[10 + $units]; 48 | } else { 49 | $ret .= BelgianDictionary::$miscNumbers[10] . '-' . BelgianDictionary::$digits[$units]; 50 | } 51 | $units = 0; 52 | } elseif ($tens === 8) { 53 | $ret .= BelgianDictionary::$digits[4] . BelgianDictionary::$dash . BelgianDictionary::$miscNumbers[20]; 54 | $resto = $tens * 10 + $units - 80; 55 | if ($resto) { 56 | $ret .= BelgianDictionary::$dash; 57 | $ret .= $this->showDigitsGroup($resto); 58 | $units = 0; 59 | } else { 60 | $ret .= BelgianDictionary::$pluralSuffix; 61 | } 62 | } else { 63 | $ret .= BelgianDictionary::$miscNumbers[$tens * 10]; 64 | } 65 | } 66 | 67 | if ($units) { 68 | if ($tens) { 69 | if ($units === 1) { 70 | $ret .= BelgianDictionary::$wordSeparator . BelgianDictionary::$and . BelgianDictionary::$wordSeparator; 71 | } else { 72 | $ret .= BelgianDictionary::$dash; 73 | } 74 | } 75 | $ret .= BelgianDictionary::$digits[$units]; 76 | } 77 | 78 | return rtrim($ret, BelgianDictionary::$wordSeparator); 79 | } 80 | 81 | /** 82 | * @param int $num 83 | * 84 | * @return string 85 | */ 86 | protected function toWords($num) 87 | { 88 | $return = ''; 89 | 90 | if ($num === 0) { 91 | return BelgianDictionary::$zero; 92 | } 93 | 94 | if ($num < 0) { 95 | $return = BelgianDictionary::$minus . BelgianDictionary::$wordSeparator; 96 | $num *= -1; 97 | } 98 | 99 | $numberGroups = $this->numberToTripletsConverter->convertToTriplets($num); 100 | $sizeOfNumberGroups = count($numberGroups); 101 | 102 | foreach ($numberGroups as $i => $number) { 103 | // what is the corresponding exponent for the current group 104 | $pow = $sizeOfNumberGroups - $i; 105 | 106 | // skip processment for empty groups 107 | if ($number != '000') { 108 | if ($number != 1 || $pow != 2) { 109 | $return .= $this->showDigitsGroup( 110 | $number, 111 | $i + 1 == $sizeOfNumberGroups || $pow > 2 112 | ) . BelgianDictionary::$wordSeparator; 113 | } 114 | $return .= BelgianDictionary::$exponent[($pow - 1) * 3]; 115 | if ($pow > 2 && $number > 1) { 116 | $return .= BelgianDictionary::$pluralSuffix; 117 | } 118 | $return .= BelgianDictionary::$wordSeparator; 119 | } 120 | } 121 | 122 | return rtrim($return, BelgianDictionary::$wordSeparator); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Id.php: -------------------------------------------------------------------------------- 1 | [''], 17 | 3 => ['ribu'], 18 | 6 => ['juta'], 19 | 9 => ['milyar'], 20 | 12 => ['trilyun'], 21 | 24 => ['quadrillion'], 22 | 30 => ['quintillion'], 23 | 36 => ['sextillion'], 24 | 42 => ['septillion'], 25 | 48 => ['octillion'], 26 | 54 => ['nonillion'], 27 | 60 => ['decillion'], 28 | 66 => ['undecillion'], 29 | ]; 30 | 31 | private static $digits = [ 32 | 'nol', 33 | 'satu', 34 | 'dua', 35 | 'tiga', 36 | 'empat', 37 | 'lima', 38 | 'enam', 39 | 'tujuh', 40 | 'delapan', 41 | 'sembilan' 42 | ]; 43 | 44 | private $wordSeparator = ' '; 45 | 46 | /** 47 | * @param int $number 48 | * @param int $power 49 | * 50 | * @return string 51 | */ 52 | protected function toWords($number, $power = 0) 53 | { 54 | $return = ''; 55 | 56 | if ($number < 0) { 57 | $return .= $this->minus; 58 | $number *= -1; 59 | } 60 | 61 | if (strlen($number) > 4) { 62 | $maxp = strlen($number) - 1; 63 | $curp = $maxp; 64 | 65 | for ($p = $maxp; $p > 0; --$p) { // power 66 | // check for highest power 67 | if (isset(self::$exponent[$p])) { 68 | // send substr from $curp to $p 69 | $snum = substr($number, $maxp - $curp, $curp - $p + 1); 70 | $snum = preg_replace('/^0+/', '', $snum); 71 | if ($snum !== '') { 72 | $cursuffix = self::$exponent[$power][count(self::$exponent[$power]) - 1]; 73 | 74 | $return .= $this->toWords($snum, $p, $cursuffix); 75 | } 76 | $curp = $p - 1; 77 | continue; 78 | } 79 | } 80 | $number = substr($number, $maxp - $curp, $curp - $p + 1); 81 | if ($number == 0) { 82 | return $return; 83 | } 84 | } elseif ($number == 0 || $number == '') { 85 | return $this->wordSeparator . self::$digits[0]; 86 | } 87 | 88 | $h = $t = $d = $th = 0; 89 | 90 | switch (strlen($number)) { 91 | case 4: 92 | $th = (int) substr($number, -4, 1); 93 | 94 | case 3: 95 | $h = (int) substr($number, -3, 1); 96 | 97 | case 2: 98 | $t = (int) substr($number, -2, 1); 99 | 100 | case 1: 101 | $d = (int) substr($number, -1, 1); 102 | break; 103 | 104 | case 0: 105 | return; 106 | break; 107 | } 108 | 109 | if ($th) { 110 | if ($th == 1) { 111 | $return .= $this->wordSeparator . 'seribu'; 112 | } else { 113 | $return .= $this->wordSeparator . self::$digits[$th] . $this->wordSeparator . 'ribu'; 114 | } 115 | } 116 | 117 | if ($h) { 118 | if ($h == 1) { 119 | $return .= $this->wordSeparator . 'seratus'; 120 | } else { 121 | $return .= $this->wordSeparator . self::$digits[$h] . $this->wordSeparator . 'ratus'; 122 | } 123 | } 124 | 125 | // ten, twenty etc. 126 | switch ($t) { 127 | case 9: 128 | case 8: 129 | case 7: 130 | case 6: 131 | case 5: 132 | case 4: 133 | case 3: 134 | case 2: 135 | $return .= $this->wordSeparator . self::$digits[$t] . ' puluh'; 136 | break; 137 | 138 | case 1: 139 | switch ($d) { 140 | case 0: 141 | $return .= $this->wordSeparator . 'sepuluh'; 142 | break; 143 | 144 | case 1: 145 | $return .= $this->wordSeparator . 'sebelas'; 146 | break; 147 | 148 | case 2: 149 | case 3: 150 | case 4: 151 | case 5: 152 | case 6: 153 | case 7: 154 | case 8: 155 | case 9: 156 | $return .= $this->wordSeparator . self::$digits[$d] . ' belas'; 157 | break; 158 | } 159 | break; 160 | } 161 | 162 | if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> 163 | // add minus sign between [2-9] and digit 164 | if ($t > 1) { 165 | $return .= ' ' . self::$digits[$d]; 166 | } else { 167 | $return .= $this->wordSeparator . self::$digits[$d]; 168 | } 169 | } 170 | 171 | if ($power > 0) { 172 | if (isset(self::$exponent[$power])) { 173 | $lev = self::$exponent[$power]; 174 | } 175 | 176 | if (!isset($lev) || !is_array($lev)) { 177 | return null; 178 | } 179 | 180 | $return .= $this->wordSeparator . $lev[0]; 181 | } 182 | 183 | return $return; 184 | } 185 | } 186 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Ka.php: -------------------------------------------------------------------------------- 1 | 'ნულ', 24 | 1 => 'ერთ', 25 | 2 => 'ორ', 26 | 3 => 'სამ', 27 | 4 => 'ოთხ', 28 | 5 => 'ხუთ', 29 | 6 => 'ექვს', 30 | 7 => 'შვიდ', 31 | 8 => 'რვა', 32 | 9 => 'ცხრა', 33 | 10 => 'ათ', 34 | 11 => 'თერთმეტ', 35 | 12 => 'თორმეტ', 36 | 13 => 'ცამეტ', 37 | 14 => 'თოთხმეტ', 38 | 15 => 'თხუთმეტ', 39 | 16 => 'თექვსმეტ', 40 | 17 => 'ჩვიდმეტ', 41 | 18 => 'თვრამეტ', 42 | 19 => 'ცხრამეტ', 43 | 20 => 'ოც', 44 | 40 => 'ორმოც', 45 | 60 => 'სამოც', 46 | 80 => 'ოთხმოც', 47 | 100 => 'ას', 48 | 1000 => 'ათას', 49 | 1000000 => 'მილიონ', 50 | 1000000000 => 'მილიარდ', 51 | 1000000000000 => 'ტრილიონ', 52 | 1000000000000000 => 'კვადრილიონ', 53 | 1000000000000000000 => 'კვინტილიონ', 54 | ); 55 | 56 | private static $currencyNames = [ 57 | 'GEL' => [['ლარი'], ['თეთრი']], 58 | 'CHF' => [['ფრანკი'], ['სენტიმი']], 59 | 'CNY' => [['იუანი'], ['ფინი']], 60 | 'DZD' => [['დინარი'], ['სენტიმი']], 61 | 'EUR' => [['ევრო'], ['სენტიმი']], 62 | 'JPY' => [['იენი', ['სენი']]], 63 | 'LYD' => [['დინარი'], ['სენტიმი']], 64 | 'MAD' => [['დირჰამი'], ['სენტიმი']], 65 | 'MXN' => [['მექსიკური პესო'], ['სენტავო']], 66 | 'TND' => [['დინარი'], ['სენტიმი']], 67 | 'USD' => [['დოლარი'], ['ცენტი']], 68 | 'TRY' => [['ლირა'], ['ყურუში']], 69 | 'AMD' => [['დრამი'], ['ლუმა']], 70 | 'PLN' => [['ზლოტი'], ['გროში']], 71 | 'GBP' => [['ფუნტი'], ['პენი']] 72 | ]; 73 | 74 | public function toCurrencyWords($currency, $decimal, $fraction = null) 75 | { 76 | $currency = strtoupper($currency); 77 | 78 | if (!array_key_exists($currency, static::$currencyNames)) { 79 | throw new NumberToWordsException( 80 | sprintf('Currency "%s" is not available for "%s" language', $currency, get_class($this)) 81 | ); 82 | } 83 | 84 | $currencyNames = static::$currencyNames[$currency]; 85 | $majorName = $currencyNames[0][0]; 86 | $minorName = $currencyNames[1][0]; 87 | 88 | $result = ''; 89 | 90 | if ($decimal != 0) { 91 | $result = $this->toWords($decimal) . ' ' . $majorName; 92 | 93 | } 94 | 95 | if ($fraction) { 96 | if($decimal != 0){ 97 | $result = $result . ' ' . self::CONJUNCTION; 98 | } 99 | $result = $result. ' ' . $this->toWords($fraction) . ' ' . $minorName; 100 | } 101 | 102 | return $result; 103 | } 104 | 105 | protected function toWords($number, $use_suffix = true, $use_spaces = true) 106 | { 107 | $space = $use_spaces ? ' ' : ''; 108 | if (!is_numeric($number)) { 109 | return false; 110 | } 111 | if ($number > PHP_INT_MAX or $number < -PHP_INT_MAX) { 112 | // overflow 113 | throw new NumberToWordsException( 114 | sprintf('out of range') 115 | ); 116 | return false; 117 | } 118 | if ($number < 0) { 119 | return self::MINUS . $this->toWords(abs($number)); 120 | } 121 | $string = $fraction = null; 122 | if (strpos($number, '.') !== false) { 123 | list($number, $fraction) = explode('.', $number); 124 | } 125 | switch (true) { 126 | case $number == 0: 127 | $string = self::$dictionary[0]; 128 | break; 129 | case $number < 21: 130 | $string = self::$dictionary[$number]; 131 | break; 132 | case $number < 100: 133 | $twenties = ((int)($number / 20)) * 20; 134 | $units = $number % 20; 135 | $string = self::$dictionary[$twenties]; 136 | if ($units) { 137 | $string .= self::CONJUNCTION . self::$dictionary[$units]; 138 | } 139 | break; 140 | case $number < 1000: 141 | $hundreds = $number / 100; 142 | $remainder = $number % 100; 143 | $hundredsStr = $hundreds < 2 ? '' : self::$dictionary[$hundreds]; 144 | $string = $hundredsStr . self::$dictionary[100]; 145 | if ($remainder) { 146 | $string .= $space . $this->toWords($remainder, false); 147 | } 148 | break; 149 | default: 150 | $baseUnit = pow(1000, floor(log($number, 1000))); 151 | $numBaseUnits = (int)($number / $baseUnit); 152 | $remainder = $number % $baseUnit; 153 | if ($numBaseUnits < 2) { 154 | $string = self::$dictionary[$baseUnit]; 155 | } else { 156 | $string = $this->toWords($numBaseUnits); 157 | $string .= $space . self::$dictionary[$baseUnit]; 158 | } 159 | if ($remainder) { 160 | $string .= $space . $this->toWords($remainder, false); 161 | } 162 | break; 163 | } 164 | // no suffix for 8 and 9 165 | if ($use_suffix and !in_array($number % 20, array(8, 9))) { 166 | $string .= self::SUFFIX; 167 | } 168 | if (null !== $fraction and is_numeric($fraction)) { 169 | $string .= self::DECIMAL; 170 | $string .= $this->toWords($fraction); 171 | $string .= self::FRACTION_PREFIX; 172 | $string .= $this->toWords(pow(10, floor(log($fraction, 10)) + 1), false, false); 173 | $string .= self::FRACTION_SUFFIX; 174 | } 175 | return $string; 176 | } 177 | 178 | 179 | } 180 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Lt.php: -------------------------------------------------------------------------------- 1 | [''], 18 | 3 => ['tūkstantis', 'tūkstančiai', 'tūkstančių'], 19 | 6 => ['milijonas', 'milijonai', 'milijonų'], 20 | 9 => ['bilijonas', 'bilijonai', 'bilijonų'], 21 | 12 => ['trilijonas', 'trilijonai', 'trilijonų'], 22 | 15 => ['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'], 23 | 18 => ['kvintilijonas', 'kvintilijonai', 'kvintilijonų'] 24 | ]; 25 | 26 | private static $digits = [ 27 | 'nulis', 28 | 'vienas', 29 | 'du', 30 | 'trys', 31 | 'keturi', 32 | 'penki', 33 | 'šeši', 34 | 'septyni', 35 | 'aštuoni', 36 | 'devyni' 37 | ]; 38 | 39 | private $wordSeparator = ' '; 40 | 41 | /** 42 | * @param int $number 43 | * @param int $power 44 | * @param string $powsuffix 45 | * 46 | * @return string 47 | */ 48 | protected function toWords($number, $power = 0, $powsuffix = '') 49 | { 50 | $return = ''; 51 | 52 | // add a minus sign 53 | if (substr($number, 0, 1) == '-') { 54 | $return = $this->wordSeparator . $this->minus; 55 | $number = substr($number, 1); 56 | } 57 | 58 | // strip excessive zero signs and spaces 59 | $number = trim($number); 60 | $number = preg_replace('/^0+/', '', $number); 61 | 62 | if (strlen($number) > 3) { 63 | $maxp = strlen($number) - 1; 64 | $curp = $maxp; 65 | for ($p = $maxp; $p > 0; --$p) { 66 | // check for highest power 67 | if (isset(self::$exponent[$p])) { 68 | // send substr from $curp to $p 69 | $snum = substr($number, $maxp - $curp, $curp - $p + 1); 70 | $snum = preg_replace('/^0+/', '', $snum); 71 | if ($snum !== '') { 72 | $cursuffix = self::$exponent[$power][count(self::$exponent[$power]) - 1]; 73 | if ($powsuffix != '') { 74 | $cursuffix .= $this->wordSeparator . $powsuffix; 75 | } 76 | 77 | $return .= $this->toWords($snum, $p, $cursuffix); 78 | } 79 | $curp = $p - 1; 80 | continue; 81 | } 82 | } 83 | $number = substr($number, $maxp - $curp, $curp - $p + 1); 84 | if ($number == 0) { 85 | return $return; 86 | } 87 | } elseif ($number == 0 || $number == '') { 88 | return $this->wordSeparator . self::$digits[0]; 89 | } 90 | 91 | $h = $t = $d = 0; 92 | 93 | switch (strlen($number)) { 94 | case 3: 95 | $h = (int) substr($number, -3, 1); 96 | 97 | case 2: 98 | $t = (int) substr($number, -2, 1); 99 | 100 | case 1: 101 | $d = (int) substr($number, -1, 1); 102 | break; 103 | 104 | case 0: 105 | return; 106 | break; 107 | } 108 | 109 | if ($h > 1) { 110 | $return .= $this->wordSeparator . self::$digits[$h] . $this->wordSeparator . 'šimtai'; 111 | } elseif ($h) { 112 | $return .= $this->wordSeparator . 'šimtas'; 113 | } 114 | 115 | // ten, twenty etc. 116 | switch ($t) { 117 | case 9: 118 | $return .= $this->wordSeparator . 'devyniasdešimt'; 119 | break; 120 | 121 | case 8: 122 | $return .= $this->wordSeparator . 'aštuoniasdešimt'; 123 | break; 124 | 125 | case 7: 126 | $return .= $this->wordSeparator . 'septyniasdešimt'; 127 | break; 128 | 129 | case 6: 130 | $return .= $this->wordSeparator . 'šešiasdešimt'; 131 | break; 132 | 133 | case 5: 134 | $return .= $this->wordSeparator . 'penkiasdešimt'; 135 | break; 136 | 137 | case 4: 138 | $return .= $this->wordSeparator . 'keturiasdešimt'; 139 | break; 140 | 141 | case 3: 142 | $return .= $this->wordSeparator . 'trisdešimt'; 143 | break; 144 | 145 | case 2: 146 | $return .= $this->wordSeparator . 'dvidešimt'; 147 | break; 148 | 149 | case 1: 150 | switch ($d) { 151 | case 0: 152 | $return .= $this->wordSeparator . 'dešimt'; 153 | break; 154 | 155 | case 1: 156 | $return .= $this->wordSeparator . 'vienuolika'; 157 | break; 158 | 159 | case 2: 160 | $return .= $this->wordSeparator . 'dvylika'; 161 | break; 162 | 163 | case 3: 164 | $return .= $this->wordSeparator . 'trylika'; 165 | break; 166 | 167 | case 4: 168 | $return .= $this->wordSeparator . 'keturiolika'; 169 | break; 170 | 171 | case 5: 172 | $return .= $this->wordSeparator . 'penkiolika'; 173 | break; 174 | 175 | case 6: 176 | $return .= $this->wordSeparator . 'šešiolika'; 177 | break; 178 | 179 | case 7: 180 | $return .= $this->wordSeparator . 'septyniolika'; 181 | break; 182 | 183 | case 8: 184 | $return .= $this->wordSeparator . 'aštuoniolika'; 185 | break; 186 | 187 | case 9: 188 | $return .= $this->wordSeparator . 'devyniolika'; 189 | break; 190 | } 191 | break; 192 | } 193 | 194 | // add digits only in <0>,<1,9> and <21,inf> 195 | if ($t != 1 && $d > 0) { 196 | if ($d > 1 || !$power || $t) { 197 | $return .= $this->wordSeparator . self::$digits[$d]; 198 | } 199 | } 200 | 201 | if ($power > 0) { 202 | if (isset(self::$exponent[$power])) { 203 | $lev = self::$exponent[$power]; 204 | } 205 | 206 | if (!isset($lev) || !is_array($lev)) { 207 | return null; 208 | } 209 | 210 | //echo " $t $d
"; 211 | 212 | if ($t == 1 || ($t > 0 && $d == 0)) { 213 | $return .= $this->wordSeparator . $lev[2]; 214 | } elseif ($d > 1) { 215 | $return .= $this->wordSeparator . $lev[1]; 216 | } else { 217 | $return .= $this->wordSeparator . $lev[0]; 218 | } 219 | } 220 | 221 | if ($powsuffix != '') { 222 | $return .= $this->wordSeparator . $powsuffix; 223 | } 224 | 225 | return $return; 226 | } 227 | } 228 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Ms.php: -------------------------------------------------------------------------------- 1 | [''], 17 | 3 => ['ribu'], 18 | 6 => ['juta'], 19 | 9 => ['bilion'], 20 | 12 => ['trilion'], 21 | 24 => ['quadrillion'], 22 | 30 => ['quintillion'], 23 | 36 => ['sextillion'], 24 | 42 => ['septillion'], 25 | 48 => ['octillion'], 26 | 54 => ['nonillion'], 27 | 60 => ['decillion'], 28 | 66 => ['undecillion'], 29 | ]; 30 | 31 | private static $digits = [ 32 | 'kosong', 33 | 'satu', 34 | 'dua', 35 | 'tiga', 36 | 'empat', 37 | 'lima', 38 | 'enam', 39 | 'tujuh', 40 | 'lapan', 41 | 'sembilan' 42 | ]; 43 | 44 | private $wordSeparator = ' '; 45 | 46 | /** 47 | * @param int $number 48 | * @param int $power 49 | * 50 | * @return string 51 | */ 52 | protected function toWords($number, $power = 0) 53 | { 54 | $return = ''; 55 | 56 | if ($number < 0) { 57 | $return .= $this->minus; 58 | $number *= -1; 59 | } 60 | 61 | if (strlen($number) > 4) { 62 | $maxp = strlen($number) - 1; 63 | $curp = $maxp; 64 | 65 | for ($p = $maxp; $p > 0; --$p) { // power 66 | // check for highest power 67 | if (isset(self::$exponent[$p])) { 68 | // send substr from $curp to $p 69 | $snum = substr($number, $maxp - $curp, $curp - $p + 1); 70 | $snum = preg_replace('/^0+/', '', $snum); 71 | if ($snum !== '') { 72 | $cursuffix = self::$exponent[$power][count(self::$exponent[$power]) - 1]; 73 | 74 | $return .= $this->toWords($snum, $p, $cursuffix); 75 | } 76 | $curp = $p - 1; 77 | continue; 78 | } 79 | } 80 | $number = substr($number, $maxp - $curp, $curp - $p + 1); 81 | if ($number == 0) { 82 | return $return; 83 | } 84 | } elseif ($number == 0 || $number == '') { 85 | return $this->wordSeparator . self::$digits[0]; 86 | } 87 | 88 | $h = $t = $d = $th = 0; 89 | 90 | switch (strlen($number)) { 91 | case 4: 92 | $th = (int) substr($number, -4, 1); 93 | 94 | case 3: 95 | $h = (int) substr($number, -3, 1); 96 | 97 | case 2: 98 | $t = (int) substr($number, -2, 1); 99 | 100 | case 1: 101 | $d = (int) substr($number, -1, 1); 102 | break; 103 | 104 | case 0: 105 | return; 106 | break; 107 | } 108 | 109 | if ($th) { 110 | if ($th == 1) { 111 | $return .= $this->wordSeparator . 'seribu'; 112 | } else { 113 | $return .= $this->wordSeparator . self::$digits[$th] . $this->wordSeparator . 'ribu'; 114 | } 115 | } 116 | 117 | if ($h) { 118 | if ($h == 1) { 119 | $return .= $this->wordSeparator . 'seratus'; 120 | } else { 121 | $return .= $this->wordSeparator . self::$digits[$h] . $this->wordSeparator . 'ratus'; 122 | } 123 | } 124 | 125 | // ten, twenty etc. 126 | switch ($t) { 127 | case 9: 128 | case 8: 129 | case 7: 130 | case 6: 131 | case 5: 132 | case 4: 133 | case 3: 134 | case 2: 135 | $return .= $this->wordSeparator . self::$digits[$t] . ' puluh'; 136 | break; 137 | 138 | case 1: 139 | switch ($d) { 140 | case 0: 141 | $return .= $this->wordSeparator . 'sepuluh'; 142 | break; 143 | 144 | case 1: 145 | $return .= $this->wordSeparator . 'sebelas'; 146 | break; 147 | 148 | case 2: 149 | case 3: 150 | case 4: 151 | case 5: 152 | case 6: 153 | case 7: 154 | case 8: 155 | case 9: 156 | $return .= $this->wordSeparator . self::$digits[$d] . ' belas'; 157 | break; 158 | } 159 | break; 160 | } 161 | 162 | if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> 163 | // add minus sign between [2-9] and digit 164 | if ($t > 1) { 165 | $return .= ' ' . self::$digits[$d]; 166 | } else { 167 | $return .= $this->wordSeparator . self::$digits[$d]; 168 | } 169 | } 170 | 171 | if ($power > 0) { 172 | if (isset(self::$exponent[$power])) { 173 | $lev = self::$exponent[$power]; 174 | } 175 | 176 | if (!isset($lev) || !is_array($lev)) { 177 | return null; 178 | } 179 | 180 | $return .= $this->wordSeparator . $lev[0]; 181 | } 182 | 183 | return $return; 184 | } 185 | } 186 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Sv.php: -------------------------------------------------------------------------------- 1 | [''], 17 | 3 => ['tusen', 'tusen'], 18 | 6 => ['miljon', 'miljoner'], 19 | 9 => ['miljard', 'miljarder'], 20 | 12 => ['biljon', 'biljoner'], 21 | 15 => ['biljard', 'biljarder'], 22 | 18 => ['triljon', 'triljoner'], 23 | 21 => ['triljard', 'triljarder'], 24 | 24 => ['kvadriljon', 'kvadriljoner'], 25 | 27 => ['kvadriljard', 'kvadriljarder'], 26 | 30 => ['kvintiljon', 'kvintiljoner'], 27 | 33 => ['kvintiljard', 'kvintiljarder'], 28 | 36 => ['sextiljon', 'sextiljoner'], 29 | 39 => ['sextiljard', 'sextiljarder'], 30 | 42 => ['septiljon', 'septiljoner'], 31 | 45 => ['septiljard', 'septiljarder'], 32 | 48 => ['oktiljon', 'oktiljoner'], 33 | 51 => ['oktiljard', 'oktiljarder'], 34 | 54 => ['noniljon', 'noniljoner'], 35 | 57 => ['noniljard', 'noniljarder'], 36 | 60 => ['dekiljon', 'dekiljoner'], 37 | 63 => ['dekiljard', 'dekiljarder'], 38 | ]; 39 | 40 | private static $digits = [ 41 | 'noll', 42 | 'en', 43 | 'två', 44 | 'tre', 45 | 'fyra', 46 | 'fem', 47 | 'sex', 48 | 'sju', 49 | 'åtta', 50 | 'nio' 51 | ]; 52 | 53 | private $wordSeparator = ' '; 54 | 55 | private $exponentWordSeparator = '-'; 56 | 57 | 58 | /** 59 | * @param int $num 60 | * @param int $power 61 | * @param string $powsuffix 62 | * 63 | * @return string 64 | */ 65 | protected function toWords($num, $power = 0, $powsuffix = '') 66 | { 67 | $ret = ''; 68 | 69 | // add a minus sign 70 | if (substr($num, 0, 1) == '-') { 71 | $ret = $this->wordSeparator . $this->minus; 72 | $num = substr($num, 1); 73 | } 74 | 75 | // strip excessive zero signs and spaces 76 | $num = trim($num); 77 | $num = preg_replace('/^0+/', '', $num); 78 | 79 | if (strlen($num) > 3) { 80 | $maxp = strlen($num) - 1; 81 | $curp = $maxp; 82 | 83 | for ($p = $maxp; $p > 0; --$p) { // power 84 | 85 | // check for highest power 86 | if (isset(self::$exponent[$p])) { 87 | // send substr from $curp to $p 88 | $snum = substr($num, $maxp - $curp, $curp - $p + 1); 89 | $snum = preg_replace('/^0+/', '', $snum); 90 | 91 | if ($snum !== '') { 92 | $cursuffix = self::$exponent[$power][count(self::$exponent[$power]) - 1]; 93 | if ($powsuffix != '') { 94 | $cursuffix .= $this->wordSeparator . $powsuffix; 95 | } 96 | 97 | $ret .= $this->toWords($snum, $p, $cursuffix); 98 | } 99 | 100 | $curp = $p - 1; 101 | continue; 102 | } 103 | } 104 | 105 | $num = substr($num, $maxp - $curp, $curp - $p + 1); 106 | if ($num == 0) { 107 | return $ret; 108 | } 109 | } elseif ($num == 0 || $num == '') { 110 | return $this->wordSeparator . self::$digits[0]; 111 | } 112 | 113 | $h = $t = $d = 0; 114 | 115 | switch (strlen($num)) { 116 | case 3: 117 | $h = (int) substr($num, -3, 1); 118 | 119 | case 2: 120 | $t = (int) substr($num, -2, 1); 121 | 122 | case 1: 123 | $d = (int) substr($num, -1, 1); 124 | break; 125 | 126 | case 0: 127 | return; 128 | break; 129 | } 130 | 131 | if ($h) { 132 | $ret .= $this->wordSeparator . self::$digits[$h] . $this->wordSeparator . 'hundra'; 133 | } 134 | 135 | // ten, twenty etc. 136 | switch ($t) { 137 | case 5: 138 | case 6: 139 | case 7: 140 | $ret .= $this->wordSeparator . self::$digits[$t] . 'tio'; 141 | break; 142 | 143 | case 9: 144 | $ret .= $this->wordSeparator . 'nittio'; 145 | break; 146 | 147 | case 8: 148 | $ret .= $this->wordSeparator . 'åttio'; 149 | break; 150 | 151 | case 4: 152 | $ret .= $this->wordSeparator . 'fyrtio'; 153 | break; 154 | 155 | case 3: 156 | $ret .= $this->wordSeparator . 'trettio'; 157 | break; 158 | 159 | case 2: 160 | $ret .= $this->wordSeparator . 'tjugo'; 161 | break; 162 | 163 | case 1: 164 | switch ($d) { 165 | case 0: 166 | $ret .= $this->wordSeparator . 'tio'; 167 | break; 168 | 169 | case 1: 170 | $ret .= $this->wordSeparator . 'elva'; 171 | break; 172 | 173 | case 2: 174 | $ret .= $this->wordSeparator . 'tolv'; 175 | break; 176 | 177 | case 3: 178 | $ret .= $this->wordSeparator . 'tretton'; 179 | break; 180 | 181 | case 4: 182 | $ret .= $this->wordSeparator . 'fjorton'; 183 | break; 184 | 185 | case 5: 186 | case 6: 187 | $ret .= $this->wordSeparator . self::$digits[$d] . 'ton'; 188 | break; 189 | 190 | case 7: 191 | $ret .= $this->wordSeparator . 'sjutton'; 192 | break; 193 | 194 | case 8: 195 | $ret .= $this->wordSeparator . 'arton'; 196 | break; 197 | case 9: 198 | $ret .= $this->wordSeparator . 'nitton'; 199 | } 200 | break; 201 | } 202 | 203 | if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> 204 | // add minus sign between [2-9] and digit 205 | $ret .= $this->wordSeparator . self::$digits[$d]; 206 | } 207 | 208 | if ($power > 0) { 209 | if (isset(self::$exponent[$power])) { 210 | $lev = self::$exponent[$power]; 211 | } 212 | 213 | if (!isset($lev) || !is_array($lev)) { 214 | return null; 215 | } 216 | 217 | $ret .= $this->wordSeparator . $lev[0]; 218 | } 219 | 220 | if ($powsuffix != '') { 221 | $ret .= $this->wordSeparator . $powsuffix; 222 | } 223 | 224 | return $ret; 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Tk.php: -------------------------------------------------------------------------------- 1 | 'on', 22 | 'ýigrimi', 23 | 'otuz', 24 | 'kyrk', 25 | 'elli', 26 | 'altmyş', 27 | 'ýetmiş', 28 | 'segsen', 29 | 'togsan', 30 | ]; 31 | 32 | protected static $mega = [ 33 | '', 34 | '', 35 | 'müň', 36 | 'million', 37 | 'milliard', 38 | 'trillion', 39 | 'kwadrillion', 40 | ]; 41 | 42 | protected static $currencyNames = [ 43 | 'USD' => [ 44 | 'dollar', 45 | 'sent' 46 | ], 47 | 'TMT' => [ 48 | 'manat', 49 | 'teňňe' 50 | ], 51 | ]; 52 | 53 | private $wordSeparator = ' '; 54 | 55 | /** 56 | * @param $number 57 | * @return string 58 | * @internal param int $num 59 | * @internal param int $power 60 | * 61 | */ 62 | protected function toWords($number) 63 | { 64 | if ($number === 0) { 65 | return $this->zero; 66 | } 67 | 68 | $out = []; 69 | 70 | if ($number < 0) { 71 | $out[] = $this->minus; 72 | $number *= -1; 73 | } 74 | 75 | $megaSize = count(static::$mega); 76 | $signs = $megaSize * 3; 77 | 78 | // $signs equal quantity of zeros of the biggest number in self::$mega 79 | // + 3 additional sign (point and two zero) 80 | list ($unit, $subunit) = explode('.', sprintf("%{$signs}.2f", (float) $number)); 81 | 82 | // return sprintf("%{1}.2f", (float) $number); 83 | 84 | foreach (str_split($unit, 3) as $megaKey => $value) { 85 | if (!(int) $value) { 86 | continue; 87 | } 88 | 89 | $megaKey = $megaSize - $megaKey - 1; 90 | // $gender = static::$mega[$megaKey][3]; 91 | list ($i1, $i2, $i3) = array_map('intval', str_split($value, 1)); 92 | // mega-logic 93 | if ($i1 > 0) { 94 | $out[] = static::$ten[$i1] . ' ýüz'; # 1xx-9xx 95 | } 96 | 97 | // tens 98 | if ($i2 > 0) { 99 | $out[] = static::$tens[$i2]; 100 | } 101 | 102 | // ones 103 | if ($i3 > 0) { 104 | $out[] = static::$ten[$i3]; 105 | } 106 | 107 | if ($megaKey > 1) { 108 | $out[] = static::$mega[$megaKey]; 109 | } 110 | } 111 | 112 | return trim(preg_replace('/\s+/', ' ', implode(' ', $out))); 113 | } 114 | 115 | /** 116 | * @param $currency 117 | * @param $decimal 118 | * @param null $fraction 119 | * @return string 120 | * @throws NumberToWordsException 121 | */ 122 | public function toCurrencyWords($currency, $decimal, $fraction = null) 123 | { 124 | $currency = strtoupper($currency); 125 | 126 | if (!array_key_exists($currency, static::$currencyNames)) { 127 | throw new NumberToWordsException( 128 | sprintf('Currency "%s" is not available for "%s" language', $currency, get_class($this)) 129 | ); 130 | } 131 | 132 | $currencyNames = static::$currencyNames[$currency]; 133 | 134 | $return = $this->toWords($decimal) . ' ' . $currencyNames[0]; 135 | 136 | if (null !== $fraction) { 137 | $return .= ' ' . $this->toWords($fraction) . ' ' . $currencyNames[1]; 138 | } 139 | 140 | return $return; 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Tr.php: -------------------------------------------------------------------------------- 1 | [['Arnavut leki'], ['qindarka']], 72 | 'AUD' => [['Avusturalya doları'], ['sent']], 73 | 'BAM' => [['Bosna-Hersek değiştirilebilir markı'], ['fenig']], 74 | 'BGN' => [['Bulgar levası'], ['stotinka']], 75 | 'BRL' => [['Brezilya reali'], ['centavos']], 76 | 'BWP' => [['Botswana pulası'], ['thebe']], 77 | 'BYR' => [['Belarus rublesi'], ['kopiejka']], 78 | 'CAD' => [['Kanada doları'], ['sent']], 79 | 'CHF' => [['İsveç frankı'], ['rapp']], 80 | 'CNY' => [['Çin yuanı'], ['fen']], 81 | 'CYP' => [['Kıbrıs poundu'], ['sent']], 82 | 'CZK' => [['Çek kronu'], ['halerz']], 83 | 'DKK' => [['Danimarka kronu'], ['ore']], 84 | 'EEK' => [['Estonya kronu'], ['senti']], 85 | 'EUR' => [['avro'], ['sent']], 86 | 'GBP' => [['pound'], ['pence']], 87 | 'HKD' => [['Hong Kong doları'], ['sent']], 88 | 'HRK' => [['Hırvatistan kunası'], ['lipa']], 89 | 'HUF' => [['Macar forinti'], ['filler']], 90 | 'ILS' => [['İsrail şekeli'], ['agora']], 91 | 'ISK' => [['Izlanda kronu'], ['aurar']], 92 | 'JPY' => [['Japon yeni'], ['sen']], 93 | 'LTL' => [['Litvanya litası'], ['sent']], 94 | 'LVL' => [['Letonya latı'], ['sentim']], 95 | 'MKD' => [['Makedonya dinarı'], ['deni']], 96 | 'MTL' => [['Malta lirası'], ['centym']], 97 | 'NOK' => [['Norveç kronu'], ['oere']], 98 | 'PLN' => [['Polonya zlotisi'], ['grosz']], 99 | 'ROL' => [['Roman leyi'], ['bani']], 100 | 'RUB' => [['Rus rublesi'], ['kopiejka']], 101 | 'SEK' => [['İsveç kronu'], ['oere']], 102 | 'SIT' => [['Slovenya toları'], ['stotinia']], 103 | 'SKK' => [['Slovakya kronu'], ['']], 104 | 'TRY' => [['Türk lirası'], ['kuruş']], 105 | 'UAH' => [['Ukrayna hryvnyası'], ['kopiyka']], 106 | 'USD' => [['ABD doları'], ['sent']], 107 | 'YUM' => [['Yugoslav dinarı'], ['para']], 108 | 'ZAR' => [['Güney Afrika randı'], ['sent']] 109 | ]; 110 | 111 | /** 112 | * @param int $num 113 | * 114 | * @return string 115 | */ 116 | protected function toWords($num) 117 | { 118 | $ret = ''; 119 | $num = strval($num); 120 | 121 | if ((int)$num === 0) { 122 | return self::$digits[0]; 123 | } 124 | 125 | if (substr($num, 0, 1) == '-') { 126 | $ret = $this->minus . $this->wordSeparator; 127 | $num = substr($num, 1); 128 | } 129 | 130 | $num = preg_replace('/^0+/', '', $num); 131 | $num_length = strlen($num); 132 | 133 | if ($num_length % 3 !== 0) { 134 | $num = str_pad($num, $num_length + (3-($num_length%3)), '0', STR_PAD_LEFT); 135 | } 136 | 137 | $groups = str_split($num, 3); 138 | $g_index = count($groups) - 1; 139 | foreach ($groups as $i => $g) { 140 | 141 | if ((int)$g[0] > 1) 142 | $ret .= self::$digits[$g[0]] . $this->wordSeparator; 143 | 144 | if ((int)$g[0] > 0) 145 | $ret .= "yüz" . $this->wordSeparator; 146 | 147 | if ((int)$g[1] > 0) 148 | $ret .= self::$digits_second[$g[1]] . $this->wordSeparator; 149 | 150 | if ((int)$g[2] > 0 && (($num_length === 4 && $i === 0 && (int)$g[2] <= 1) === false)) 151 | $ret .= self::$digits[$g[2]] . $this->wordSeparator; 152 | 153 | if ((int)$g > 0) 154 | $ret .= self::$exponent[$g_index] . $this->wordSeparator; 155 | 156 | $g_index--; 157 | } 158 | 159 | return $ret; 160 | } 161 | 162 | /** 163 | * @param string $currency 164 | * @param int $decimal 165 | * @param int $fraction 166 | * 167 | * @throws NumberToWordsException 168 | * @return string 169 | */ 170 | public function toCurrencyWords($currency, $decimal, $fraction = null) 171 | { 172 | $currency = strtoupper($currency); 173 | 174 | if (!array_key_exists($currency, self::$currencyNames)) { 175 | throw new NumberToWordsException( 176 | sprintf('Currency "%s" is not available for "%s" language', $currency, get_class($this)) 177 | ); 178 | } 179 | 180 | $curr_names = self::$currencyNames[$currency]; 181 | $ret = trim($this->toWords($decimal)); 182 | $lev = ($decimal == 1) ? 0 : 1; 183 | if ($lev > 0) { 184 | if (count($curr_names[0]) > 1) { 185 | $ret .= $this->wordSeparator . $curr_names[0][$lev]; 186 | } else { 187 | $ret .= $this->wordSeparator . $curr_names[0][0]; 188 | } 189 | } else { 190 | $ret .= $this->wordSeparator . $curr_names[0][0]; 191 | } 192 | 193 | if ($fraction !== null) { 194 | if ($this->options->isConvertFraction()) { 195 | $ret .= $this->wordSeparator . trim($this->toWords($fraction)); 196 | } else { 197 | $ret .= $this->wordSeparator . $fraction; 198 | } 199 | $lev = ($fraction == 1) ? 0 : 1; 200 | if ($lev > 0) { 201 | if (count($curr_names[1]) > 1) { 202 | $ret .= $this->wordSeparator . $curr_names[1][$lev]; 203 | } else { 204 | $ret .= $this->wordSeparator . $curr_names[1][0]; 205 | } 206 | } else { 207 | $ret .= $this->wordSeparator . $curr_names[1][0]; 208 | } 209 | } 210 | 211 | return $ret; 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Ua.php: -------------------------------------------------------------------------------- 1 | 'двадцять', 34 | 'тридцять', 35 | 'сорок', 36 | 'п\'ятдесят', 37 | 'шістдесят', 38 | 'сімдесят', 39 | 'вісімдесят', 40 | 'дев\'яносто', 41 | ]; 42 | 43 | protected static $hundred = [ 44 | '', 45 | 'сто', 46 | 'двісті', 47 | 'триста', 48 | 'чотириста', 49 | 'п\'ятсот', 50 | 'шістсот', 51 | 'сімсот', 52 | 'вісімсот', 53 | 'дев\'ятсот', 54 | ]; 55 | 56 | protected static $mega = [ 57 | [3 => self::FEMALE], 58 | [3 => self::MALE], 59 | ['тисяча', 'тисячі', 'тисяч', self::FEMALE], 60 | ['мільйон', 'мільйони', 'мільйонів', self::MALE], 61 | ['мільярд', 'мільярди', 'мільярдів', self::MALE], 62 | ['трильйон', 'трильйони', 'трильйонів', self::MALE], 63 | ['квадрильйон', 'квадрильйони', 'квадрильйонів', self::MALE], 64 | ['секстильйон', 'секстильйони', 'секстильйонів', self::MALE], 65 | ]; 66 | 67 | protected static $currencyNames = [ 68 | 'ALL' => [ 69 | [1, 'лек', 'лека', 'леков'], 70 | [2, 'киндарка', 'киндарки', 'киндарок'], 71 | ], 72 | 'AUD' => [ 73 | [1, 'австралийский доллар', 'австралийских доллара', 'австралийских долларов'], 74 | [1, 'цент', 'цента', 'центов'], 75 | ], 76 | 'BGN' => [ 77 | [1, 'лев', 'лева', 'левов'], 78 | [2, 'стотинка', 'стотинки', 'стотинок'], 79 | ], 80 | 'BRL' => [ 81 | [1, 'бразильский реал', 'бразильских реала', 'бразильских реалов'], 82 | [1, 'сентаво', 'сентаво', 'сентаво'], 83 | ], 84 | 'BYR' => [ 85 | [1, 'белорусский рубль', 'белорусских рубля', 'белорусских рублей'], 86 | [2, 'копейка', 'копейки', 'копеек'], 87 | ], 88 | 'CAD' => [ 89 | [1, 'канадский доллар', 'канадских доллара', 'канадских долларов'], 90 | [1, 'цент', 'цента', 'центов'], 91 | ], 92 | 'CHF' => [ 93 | [1, 'швейцарский франк', 'швейцарских франка', 'швейцарских франков'], 94 | [1, 'сантим', 'сантима', 'сантимов'], 95 | ], 96 | 'CYP' => [ 97 | [1, 'кипрский фунт', 'кипрских фунта', 'кипрских фунтов'], 98 | [1, 'цент', 'цента', 'центов'], 99 | ], 100 | 'CZK' => [ 101 | [2, 'чешская крона', 'чешских кроны', 'чешских крон'], 102 | [1, 'галирж', 'галиржа', 'галиржей'], 103 | ], 104 | 'DKK' => [ 105 | [2, 'датская крона', 'датских кроны', 'датских крон'], 106 | [1, 'эре', 'эре', 'эре'], 107 | ], 108 | 'EEK' => [ 109 | [2, 'эстонская крона', 'эстонских кроны', 'эстонских крон'], 110 | [1, 'сенти', 'сенти', 'сенти'], 111 | ], 112 | 'EUR' => [ 113 | [1, 'евро', 'евро', 'евро'], 114 | [1, 'евроцент', 'евроцента', 'евроцентов'], 115 | ], 116 | 'GBP' => [ 117 | [1, 'фунт стерлингов', 'фунта стерлингов', 'фунтов стерлингов'], 118 | [1, 'пенс', 'пенса', 'пенсов'], 119 | ], 120 | 'HKD' => [ 121 | [1, 'гонконгский доллар', 'гонконгских доллара', 'гонконгских долларов'], 122 | [1, 'цент', 'цента', 'центов'], 123 | ], 124 | 'HRK' => [ 125 | [2, 'хорватская куна', 'хорватских куны', 'хорватских кун'], 126 | [2, 'липа', 'липы', 'лип'], 127 | ], 128 | 'HUF' => [ 129 | [1, 'венгерский форинт', 'венгерских форинта', 'венгерских форинтов'], 130 | [1, 'филлер', 'филлера', 'филлеров'], 131 | ], 132 | 'ISK' => [ 133 | [2, 'исландская крона', 'исландских кроны', 'исландских крон'], 134 | [1, 'эре', 'эре', 'эре'], 135 | ], 136 | 'JPY' => [ 137 | [2, 'иена', 'иены', 'иен'], 138 | [2, 'сена', 'сены', 'сен'], 139 | ], 140 | 'LTL' => [ 141 | [1, 'лит', 'лита', 'литов'], 142 | [1, 'цент', 'цента', 'центов'], 143 | ], 144 | 'LVL' => [ 145 | [1, 'лат', 'лата', 'латов'], 146 | [1, 'сентим', 'сентима', 'сентимов'], 147 | ], 148 | 'MKD' => [ 149 | [1, 'македонский динар', 'македонских динара', 'македонских динаров'], 150 | [1, 'дени', 'дени', 'дени'], 151 | ], 152 | 'MTL' => [ 153 | [2, 'мальтийская лира', 'мальтийских лиры', 'мальтийских лир'], 154 | [1, 'сентим', 'сентима', 'сентимов'], 155 | ], 156 | 'NOK' => [ 157 | [2, 'норвежская крона', 'норвежских кроны', 'норвежских крон'], 158 | [0, 'эре', 'эре', 'эре'], 159 | ], 160 | 'PLN' => [ 161 | [1, 'злотый', 'злотых', 'злотых'], 162 | [1, 'грош', 'гроша', 'грошей'], 163 | ], 164 | 'ROL' => [ 165 | [1, 'румынский лей', 'румынских лей', 'румынских лей'], 166 | [1, 'бани', 'бани', 'бани'], 167 | ], 168 | // both RUR and RUR are used, Some users use RUB for shorter form 169 | 'RUB' => [ 170 | [1, 'рубль', 'рубля', 'рублей'], 171 | [2, 'копейка', 'копейки', 'копеек'], 172 | ], 173 | 'RUR' => [ 174 | [1, 'российский рубль', 'российских рубля', 'российских рублей'], 175 | [2, 'копейка', 'копейки', 'копеек'], 176 | ], 177 | 'SEK' => [ 178 | [2, 'шведская крона', 'шведских кроны', 'шведских крон'], 179 | [1, 'эре', 'эре', 'эре'], 180 | ], 181 | 'SIT' => [ 182 | [1, 'словенский толар', 'словенских толара', 'словенских толаров'], 183 | [2, 'стотина', 'стотины', 'стотин'], 184 | ], 185 | 'SKK' => [ 186 | [2, 'словацкая крона', 'словацких кроны', 'словацких крон'], 187 | [0, '', '', ''], 188 | ], 189 | 'TRL' => [ 190 | [2, 'турецкая лира', 'турецких лиры', 'турецких лир'], 191 | [1, 'пиастр', 'пиастра', 'пиастров'], 192 | ], 193 | 'UAH' => [ 194 | [2, 'гривня', 'гривні', 'гривень'], 195 | [2, 'копійка', 'копійки', 'копійок'], 196 | ], 197 | 'USD' => [ 198 | [1, 'доллар США', 'доллара США', 'долларов США'], 199 | [1, 'цент', 'цента', 'центов'], 200 | ], 201 | 'YUM' => [ 202 | [1, 'югославский динар', 'югославских динара', 'югославских динаров'], 203 | [1, 'пара', 'пара', 'пара'], 204 | ], 205 | 'ZAR' => [ 206 | [1, 'ранд', 'ранда', 'рандов'], 207 | [1, 'цент', 'цента', 'центов'], 208 | ] 209 | ]; 210 | } 211 | -------------------------------------------------------------------------------- /src/Legacy/Numbers/Words/Locale/Yo.php: -------------------------------------------------------------------------------- 1 | '', 26 | 1 => 'ọkan', 27 | 2 => 'meji', 28 | 3 => 'mẹta', 29 | 4 => 'mẹrin', 30 | 5 => 'marun', 31 | 6 => 'mẹfa', 32 | 7 => 'meje', 33 | 8 => 'mẹjọ', 34 | 9 => 'mẹsan' 35 | ]; 36 | 37 | protected static $teens = [ 38 | 10 => 'mẹwa', 39 | 11 => 'mọkanla', 40 | 12 => 'mejila', 41 | 13 => 'mẹtala', 42 | 14 => 'mẹrinla', 43 | 15 => 'mẹẹdogun', 44 | 16 => 'mẹrindilogun', 45 | 17 => 'mẹtala', 46 | 18 => 'mejidilogun', 47 | 19 => 'mọkandinlogun', 48 | ]; 49 | 50 | protected static $tens = [ 51 | 20 => 'ogun', 52 | 30 => 'ọgbọn', 53 | 40 => 'ogoji', 54 | 50 => 'aadọta', 55 | 60 => 'Ogota', 56 | 70 => 'aadọrin', 57 | 80 => 'ọgọrin', 58 | 90 => 'aadọrun', 59 | ]; 60 | 61 | protected static $hundred = [ 62 | 0 => '', 63 | 100 => 'ọgọrun', 64 | 200 => 'igba', 65 | 300 => 'ọ̀ọ́dúrún', 66 | 400 => 'irinwó', 67 | 500 => 'ẹdẹgbẹta', 68 | 600 => 'ẹgbẹta', 69 | 700 => 'ẹẹdẹgbẹrin', 70 | 800 => 'ẹgbẹ̀rin', 71 | 900 => 'ẹ̀ẹ́dẹ́gbẹ̀rún', 72 | ]; 73 | 74 | protected static $mega = [ 75 | 1 => 'ẹgbẹrun', 76 | 2 => 'miliọnu', 77 | 3 => 'biliọnu', 78 | 4 => 'miliọnu miliọnu', 79 | 5 => 'biliọnu miliọnu', 80 | 6 => 'biliọnu biliọnu', 81 | 7 => 'aimoye miliọnu', 82 | ]; 83 | 84 | public static $currencyNames = [ 85 | 'ALL' => [['lek'], ['qindarka']], 86 | 'AUD' => [['Australian dollar'], ['cent']], 87 | 'BAM' => [['convertible marka'], ['fenig']], 88 | 'BGN' => [['lev'], ['stotinka']], 89 | 'BRL' => [['real'], ['centavos']], 90 | 'BYR' => [['Belarussian rouble'], ['kopiejka']], 91 | 'CAD' => [['Canadian dollar'], ['cent']], 92 | 'CHF' => [['Swiss franc'], ['rapp']], 93 | 'CYP' => [['Cypriot pound'], ['cent']], 94 | 'CZK' => [['Czech koruna'], ['halerz']], 95 | 'DKK' => [['Danish krone'], ['ore']], 96 | 'DZD' => [['dinar'], ['cent']], 97 | 'EEK' => [['kroon'], ['senti']], 98 | 'EUR' => [['euro'], ['euro-cent']], 99 | 'GBP' => [['pound', 'pounds'], ['pence', 'pence']], 100 | 'HKD' => [['Hong Kong dollar'], ['cent']], 101 | 'HRK' => [['Croatian kuna'], ['lipa']], 102 | 'HUF' => [['forint'], ['filler']], 103 | 'ILS' => [['new sheqel', 'new sheqels'], ['agora', 'agorot']], 104 | 'ISK' => [['Icelandic króna'], ['aurar']], 105 | 'JPY' => [['yen'], ['sen']], 106 | 'LTL' => [['litas'], ['cent']], 107 | 'LVL' => [['lat'], ['sentim']], 108 | 'LYD' => [['dinar'], ['cent']], 109 | 'MAD' => [['dirham'], ['cent']], 110 | 'MKD' => [['Macedonian dinar'], ['deni']], 111 | 'MRO' => [['ouguiya'], ['khoums']], 112 | 'MTL' => [['Maltese lira'], ['centym']], 113 | 'NGN' => [['Naira'], ['kobo']], 114 | 'NOK' => [['Norwegian krone'], ['oere']], 115 | 'PHP' => [['peso'], ['centavo']], 116 | 'PLN' => [['zloty', 'zlotys'], ['grosz']], 117 | 'ROL' => [['Romanian leu'], ['bani']], 118 | 'RUB' => [['Russian Federation rouble'], ['kopiejka']], 119 | 'SEK' => [['Swedish krona'], ['oere']], 120 | 'SIT' => [['Tolar'], ['stotinia']], 121 | 'SKK' => [['Slovak koruna'], []], 122 | 'TMT' => [['manat'], ['tenge']], 123 | 'TND' => [['dinar'], ['cent']], 124 | 'TRL' => [['lira'], ['kuruş']], 125 | 'UAH' => [['hryvna'], ['cent']], 126 | 'USD' => [['dollar'], ['cent']], 127 | 'XAF' => [['CFA franc'], ['cent']], 128 | 'XOF' => [['CFA franc'], ['cent']], 129 | 'XPF' => [['CFP franc'], ['centime']], 130 | 'YUM' => [['dinar'], ['para']], 131 | 'ZAR' => [['rand'], ['cent']], 132 | ]; 133 | 134 | /** 135 | * @param $num 136 | * @return string 137 | */ 138 | protected function toWords($num) 139 | { 140 | $word = ""; 141 | $num = preg_replace('/[\W]/', '', $num); 142 | $formatted = number_format((int)$num, 2); 143 | 144 | $leftNumber = explode(".", $formatted); 145 | $split = explode(",", $leftNumber[0]); 146 | 147 | foreach ($split as $key => $number) { 148 | if(!$number) { continue; 149 | } 150 | $suffix = $this->_suffix($number); //2 151 | $prefix = $this->_prefix(count($split) - 1); //million 152 | $combined = trim($prefix.' '.$suffix); 153 | 154 | $word .= ((count($split) == 1 && !empty($word) 155 | ? " " . self::$conjunction . " " 156 | : !empty($word)) ? ", " : "") . $combined; 157 | unset($split[$key]); 158 | } 159 | 160 | return preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $word); 161 | } 162 | 163 | private function _prefix($num) 164 | { 165 | switch ($num) { 166 | case 0: 167 | return ''; 168 | case 1: 169 | case 2: 170 | case 3: 171 | case 4: 172 | case 5: 173 | case 6: 174 | return self::$mega[$num]; 175 | default: 176 | return self::$mega[7]; 177 | } 178 | } 179 | 180 | private function _suffix($num) 181 | { 182 | $word = ""; 183 | $num = (int) $num; 184 | if (strlen($num) == 3) { 185 | $hundred = $num - ($num % 100); 186 | $word .= self::$hundred[$hundred]; 187 | 188 | $num = (int) substr($num, 1); 189 | } 190 | if (strlen($num) == 2 && $num > 19) { 191 | $ten = $num - ($num % 10); 192 | $word .= ($word && !empty(self::$tens[$ten]) 193 | ? " " . self::$conjunction . " " : '') . self::$tens[$ten]; 194 | 195 | $num = (int) substr($num, 1); 196 | } 197 | 198 | if (strlen($num) == 2 && $num <= 19) { 199 | $word .= ($word && !empty(self::$teens[$num]) 200 | ? " " . self::$conjunction . " " : '') . self::$teens[$num]; 201 | 202 | $num = str_replace($num, "", $num); 203 | } 204 | 205 | if (strlen($num) == 1) { 206 | $word .= ($word && !empty(self::$unit[$num]) 207 | ? " " . self::$conjunction . " " : '') . self::$unit[$num]; 208 | } 209 | 210 | return $word; 211 | } 212 | 213 | /** 214 | * @param string $currency 215 | * @param int $decimal 216 | * @param int $fraction 217 | * 218 | * @return string 219 | * @throws NumberToWordsException 220 | */ 221 | public function toCurrencyWords($currency, $decimal, $fraction = null) 222 | { 223 | $currency = strtoupper($currency); 224 | 225 | if (!array_key_exists($currency, static::$currencyNames)) { 226 | throw new NumberToWordsException( 227 | sprintf( 228 | 'Currency "%s" is not available for "%s" language', 229 | $currency, 230 | get_class($this) 231 | ) 232 | ); 233 | } 234 | 235 | $actual = $this->toWords($decimal); 236 | 237 | $word = $actual . " " . self::$currencyNames[$currency][0][0]; 238 | 239 | if ($fraction) { 240 | $decimal = $this->toWords($fraction); 241 | $word .= " ".self::$separator . " "; 242 | $word .= self::$currencyNames[$currency][1][0]. " ".$decimal; 243 | } 244 | 245 | return $word; 246 | } 247 | 248 | } 249 | -------------------------------------------------------------------------------- /src/NumberToWords.php: -------------------------------------------------------------------------------- 1 | getCurrencyTransformer($arguments[1])->$name($arguments[0], $arguments[2]); 13 | } 14 | 15 | // Just numbers 16 | if(count($arguments) == 2) { 17 | return $ntw->getNumberTransformer($arguments[1])->$name($arguments[0]); 18 | } 19 | 20 | throw new \InvalidArgumentException("Minimum of 2 parameters required to convert numbers to words."); 21 | } 22 | 23 | public function __call($name, $arguments) 24 | { 25 | return $this->__callStatic($name, $arguments); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/NumberToWordsFacade.php: -------------------------------------------------------------------------------- 1 | loadTranslationsFrom(__DIR__.'/../resources/lang', 'number-to-words'); 18 | // $this->loadViewsFrom(__DIR__.'/../resources/views', 'number-to-words'); 19 | // $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); 20 | // $this->loadRoutesFrom(__DIR__.'/routes.php'); 21 | 22 | if ($this->app->runningInConsole()) { 23 | $this->publishes([ 24 | __DIR__.'/../config/config.php' => config_path('number-to-words.php'), 25 | ], 'config'); 26 | } 27 | } 28 | 29 | /** 30 | * Register the application services. 31 | */ 32 | public function register() 33 | { 34 | // Automatically apply the package configuration 35 | $this->mergeConfigFrom(__DIR__.'/../config/config.php', 'number-to-words'); 36 | 37 | // Register the main class to use with the facade 38 | $this->app->singleton('number-to-words', function () { 39 | return new NumberToWords; 40 | }); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/NumberTransformer/AlbanianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 24 | ->withExponentsSeparatedBy('e') 25 | ->withWordsSeparatedBy(' ') 26 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 27 | ->useRegularExponents($exponentInflector) 28 | ->build(); 29 | 30 | return $numberTransformer->toWords($number); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/NumberTransformer/BulgarianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'bg'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/CzechNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'cs'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/DanishNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'dk'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/DutchNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'nl'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/EnglishNumberTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 24 | ->withWordsSeparatedBy(' ') 25 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 26 | ->useRegularExponents($exponentInflector) 27 | ->build(); 28 | 29 | return $numberTransformer->toWords($number); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/NumberTransformer/EstonianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'et'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/FrenchBelgianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'fr_BE'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/FrenchNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'fr'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/GenericNumberTransformer.php: -------------------------------------------------------------------------------- 1 | dictionary->getZero(); 63 | } 64 | 65 | $words = []; 66 | 67 | if ($number < 0) { 68 | $words[] = $this->dictionary->getMinus(); 69 | $number *= -1; 70 | } 71 | 72 | if (null !== $this->tripletTransformer || null !== $this->powerAwareTripletTransformer) { 73 | $words = array_merge($words, $this->getWordsBySplittingIntoTriplets($number)); 74 | } 75 | 76 | return trim(implode($this->wordsSeparator, $words)); 77 | } 78 | 79 | /** 80 | * @param int $number 81 | * 82 | * @return array 83 | */ 84 | private function getWordsBySplittingIntoTriplets($number) 85 | { 86 | $words = []; 87 | $triplets = $this->numberToTripletsConverter->convertToTriplets($number); 88 | 89 | foreach ($triplets as $i => $triplet) { 90 | if ($triplet > 0) { 91 | if (null !== $this->tripletTransformer) { 92 | $words[] = $this->tripletTransformer->transformToWords($triplet); 93 | } 94 | 95 | if (null !== $this->powerAwareTripletTransformer) { 96 | $words[] = $this->powerAwareTripletTransformer->transformToWords( 97 | $triplet, 98 | count($triplets) - $i - 1 99 | ); 100 | } 101 | 102 | if (null !== $this->exponentInflector) { 103 | $words[] = $this->exponentInflector->inflectExponent($triplet, count($triplets) - $i - 1); 104 | } 105 | 106 | if (null !== $this->exponentGetter) { 107 | $words[] = $this->exponentGetter->getExponent(count($triplets) - $i - 1); 108 | } 109 | } 110 | } 111 | if (null !== $this->exponentSeparator && count($words) > 2) { 112 | for ($i = 2; $i <= count($words) - 2; $i+=2) { 113 | array_splice($words, $i++, 0, $this->exponentSeparator); 114 | } 115 | } 116 | return $words; 117 | } 118 | 119 | /** 120 | * @param Dictionary $dictionary 121 | */ 122 | public function setDictionary(Dictionary $dictionary) 123 | { 124 | $this->dictionary = $dictionary; 125 | } 126 | 127 | /** 128 | * @param TripletTransformer $tripletTransformer 129 | */ 130 | public function setTripletTransformer(TripletTransformer $tripletTransformer) 131 | { 132 | $this->tripletTransformer = $tripletTransformer; 133 | $this->powerAwareTripletTransformer = null; 134 | } 135 | 136 | /** 137 | * @param PowerAwareTripletTransformer $powerAwareTripletTransformer 138 | */ 139 | public function setPowerAwareTripletTransformer(PowerAwareTripletTransformer $powerAwareTripletTransformer) 140 | { 141 | $this->powerAwareTripletTransformer = $powerAwareTripletTransformer; 142 | $this->tripletTransformer = null; 143 | } 144 | 145 | /** 146 | * @param string $wordsSeparator 147 | */ 148 | public function setWordsSeparator($wordsSeparator) 149 | { 150 | $this->wordsSeparator = $wordsSeparator; 151 | } 152 | 153 | /** 154 | * @param NumberToTripletsConverter $numberToTripletsConverter 155 | */ 156 | public function setNumberToTripletsConverter(NumberToTripletsConverter $numberToTripletsConverter) 157 | { 158 | $this->numberToTripletsConverter = $numberToTripletsConverter; 159 | } 160 | 161 | /** 162 | * @param ExponentInflector $exponentInflector 163 | */ 164 | public function setExponentInflector(ExponentInflector $exponentInflector) 165 | { 166 | $this->exponentInflector = $exponentInflector; 167 | $this->exponentGetter = null; 168 | } 169 | 170 | /** 171 | * @param ExponentGetter $exponentGetter 172 | */ 173 | public function setExponentGetter(ExponentGetter $exponentGetter) 174 | { 175 | $this->exponentGetter = $exponentGetter; 176 | $this->exponentInflector = null; 177 | } 178 | 179 | /** 180 | * @param string $exponentSeparator 181 | */ 182 | public function setExponentsSeparator($exponentSeparator) 183 | { 184 | $this->exponentSeparator = $exponentSeparator; 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /src/NumberTransformer/GeorgianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'ka'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/NumberTransformer/GermanNumberTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 24 | ->withWordsSeparatedBy('') 25 | ->transformNumbersBySplittingIntoPowerAwareTriplets($numberToTripletsConverter, $tripletTransformer) 26 | ->inflectExponentByNumbers($exponentInflector) 27 | ->build(); 28 | 29 | return $numberTransformer->toWords($number); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/NumberTransformer/HungarianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'hu'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/IndonesianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'id'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/ItalianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'it'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/LatvianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 24 | ->withWordsSeparatedBy(' ') 25 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 26 | ->inflectExponentByNumbers($exponentInflector) 27 | ->build(); 28 | 29 | return $numberTransformer->toWords($number); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/NumberTransformer/LithuanianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'lt'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/MalayNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'ms'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/NumberTransformer.php: -------------------------------------------------------------------------------- 1 | numberTransformer = new GenericNumberTransformer(); 22 | } 23 | 24 | /** 25 | * @param Dictionary $dictionary 26 | * 27 | * @return $this 28 | */ 29 | public function withDictionary(Dictionary $dictionary) 30 | { 31 | $this->numberTransformer->setDictionary($dictionary); 32 | 33 | return $this; 34 | } 35 | 36 | /** 37 | * @param string $separator 38 | * 39 | * @return $this 40 | */ 41 | public function withWordsSeparatedBy($separator) 42 | { 43 | $this->numberTransformer->setWordsSeparator($separator); 44 | 45 | return $this; 46 | } 47 | 48 | /** 49 | * @param string $separator 50 | * 51 | * @return $this 52 | */ 53 | public function withExponentsSeparatedBy($separator) 54 | { 55 | $this->numberTransformer->setExponentsSeparator($separator); 56 | 57 | return $this; 58 | } 59 | 60 | /** 61 | * @param NumberToTripletsConverter $numberToTripletsConverter 62 | * @param TripletTransformer $tripletTransformer 63 | * 64 | * @return $this 65 | */ 66 | public function transformNumbersBySplittingIntoTriplets( 67 | NumberToTripletsConverter $numberToTripletsConverter, 68 | TripletTransformer $tripletTransformer 69 | ) { 70 | $this->numberTransformer->setNumberToTripletsConverter($numberToTripletsConverter); 71 | $this->numberTransformer->setTripletTransformer($tripletTransformer); 72 | 73 | return $this; 74 | } 75 | 76 | /** 77 | * @param NumberToTripletsConverter $numberToTripletsConverter 78 | * @param PowerAwareTripletTransformer $powerAwareTripletTransformer 79 | * 80 | * @return $this 81 | */ 82 | public function transformNumbersBySplittingIntoPowerAwareTriplets( 83 | NumberToTripletsConverter $numberToTripletsConverter, 84 | PowerAwareTripletTransformer $powerAwareTripletTransformer 85 | ) { 86 | $this->numberTransformer->setNumberToTripletsConverter($numberToTripletsConverter); 87 | $this->numberTransformer->setPowerAwareTripletTransformer($powerAwareTripletTransformer); 88 | 89 | return $this; 90 | } 91 | 92 | /** 93 | * @param ExponentInflector $exponentInflector 94 | * 95 | * @return $this 96 | */ 97 | public function inflectExponentByNumbers(ExponentInflector $exponentInflector) 98 | { 99 | $this->numberTransformer->setExponentInflector($exponentInflector); 100 | 101 | return $this; 102 | } 103 | 104 | /** 105 | * @param ExponentGetter $exponentGetter 106 | * 107 | * @return $this 108 | */ 109 | public function useRegularExponents(ExponentGetter $exponentGetter) 110 | { 111 | $this->numberTransformer->setExponentGetter($exponentGetter); 112 | 113 | return $this; 114 | } 115 | 116 | /** 117 | * @return NumberTransformer 118 | */ 119 | public function build() 120 | { 121 | return $this->numberTransformer; 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /src/NumberTransformer/PersianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 24 | ->withWordsSeparatedBy(' ') 25 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 26 | ->useRegularExponents($exponentInflector) 27 | ->build(); 28 | 29 | return $numberTransformer->toWords($number); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/NumberTransformer/PolishNumberTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 25 | ->withWordsSeparatedBy(' ') 26 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 27 | ->inflectExponentByNumbers($exponentInflector) 28 | ->build(); 29 | 30 | return $numberTransformer->toWords($number); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/NumberTransformer/PortugueseBrazilianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'pt_BR'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/RomanianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'ro'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/RussianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'ru'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/SlovakNumberTransformer.php: -------------------------------------------------------------------------------- 1 | withDictionary($dictionary) 25 | ->withWordsSeparatedBy(' ') 26 | ->transformNumbersBySplittingIntoTriplets($numberToTripletsConverter, $tripletTransformer) 27 | ->inflectExponentByNumbers($exponentInflector) 28 | ->build(); 29 | 30 | return $numberTransformer->toWords($number); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/NumberTransformer/SpanishNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'es'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/SwedishNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'sv'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/TurkishNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'tr'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/TurkmenNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'tk'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/UkrainianNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'ua'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/NumberTransformer/YorubaNumberTransformer.php: -------------------------------------------------------------------------------- 1 | transformToWords($number, 'yo'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Service/NumberToTripletsConverter.php: -------------------------------------------------------------------------------- 1 | 0) { 17 | $triplets[] = $number % 1000; 18 | $number = (int) ($number / 1000); 19 | } 20 | 21 | return array_reverse($triplets); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/TransformerOptions/CurrencyTransformerOptions.php: -------------------------------------------------------------------------------- 1 | convertFraction; 18 | } 19 | 20 | /** 21 | * @param bool $convertFraction 22 | * 23 | * @return self 24 | */ 25 | public function setConvertFraction($convertFraction) 26 | { 27 | $this->convertFraction = $convertFraction; 28 | 29 | return $this; 30 | } 31 | 32 | /** 33 | * @return bool 34 | */ 35 | public function isConvertFractionIfZero() 36 | { 37 | return $this->convertFractionIfZero; 38 | } 39 | 40 | /** 41 | * @param bool $convertFractionIfZero 42 | * 43 | * @return self 44 | */ 45 | public function setConvertFractionIfZero($convertFractionIfZero) 46 | { 47 | $this->convertFractionIfZero = $convertFractionIfZero; 48 | 49 | return $this; 50 | } 51 | 52 | /** 53 | * @return bool 54 | */ 55 | public function isShowDecimalIfZero() 56 | { 57 | return $this->showDecimalIfZero; 58 | } 59 | 60 | /** 61 | * @param bool $showDecimalIfZero 62 | * 63 | * @return self 64 | */ 65 | public function setShowDecimalIfZero($showDecimalIfZero) 66 | { 67 | $this->showDecimalIfZero = $showDecimalIfZero; 68 | 69 | return $this; 70 | } 71 | 72 | /** 73 | * @return bool 74 | */ 75 | public function isShowFractionIfZero() 76 | { 77 | return $this->showFractionIfZero; 78 | } 79 | 80 | /** 81 | * @param bool $showFractionIfZero 82 | * 83 | * @return self 84 | */ 85 | public function setShowFractionIfZero($showFractionIfZero) 86 | { 87 | $this->showFractionIfZero = $showFractionIfZero; 88 | 89 | return $this; 90 | } 91 | } 92 | --------------------------------------------------------------------------------