Skip to content

Instantly share code, notes, and snippets.

@VladaHejda
Created March 31, 2016 13:13
Show Gist options
  • Save VladaHejda/a5aa93dce7871d0d3cda3c9bd6dd77fa to your computer and use it in GitHub Desktop.
Save VladaHejda/a5aa93dce7871d0d3cda3c9bd6dd77fa to your computer and use it in GitHub Desktop.
<?php declare(strict_types = 1);
namespace Slevomat\Number;
class NumberToWordTranslator extends \Consistence\Object
{
public function translate(int $number): string
{
$word = $this->translateSpecial($number);
if ($word !== null) {
return $word;
}
$number = (string) $number;
$magnitudes = strlen($number);
$word = '';
for ($magnitude = $magnitudes; $magnitude > 0; $magnitude--) {
$wordPart = $this->translateMagnitude($magnitude, (int) $number[$magnitudes - $magnitude]);
if ($magnitude < $magnitudes) {
$wordPart = \Nette\Utils\Strings::lower($wordPart);
}
$word .= $wordPart;
}
return $word;
}
/**
* @param int $number
* @return string|null
*/
private function translateSpecial(int $number)
{
switch ($number) {
case 11:
return _('Jedenáct');
case 12:
return _('Dvanáct');
case 13:
return _('Třináct');
case 14:
return _('Čtrnáct');
case 15:
return _('Patnáct');
case 16:
return _('Šestnáct');
case 17:
return _('Sedmnáct');
case 18:
return _('Osmnáct');
case 19:
return _('Devatenáct');
default:
return null;
}
}
private function translateMagnitude(int $magnitude, int $digit): string
{
switch ($magnitude) {
case 1:
return $this->translateFirstMagnitude($digit);
case 2:
return $this->translateSecondMagnitude($digit);
default:
throw new \Slevomat\Number\NotImplementedException();
}
}
private function translateFirstMagnitude(int $digit): string
{
switch ($digit) {
case 1:
return _('Jedna');
case 2:
return _('Dva');
case 3:
return _('Tři');
case 4:
return _('Čtyři');
case 5:
return _('Pět');
case 6:
return _('Šest');
case 7:
return _('Sedm');
case 8:
return _('Osm');
case 9:
return _('Devět');
default:
throw new \LogicException();
}
}
private function translateSecondMagnitude(int $digit): string
{
switch ($digit) {
case 1:
return _('Deset');
case 2:
return _('Dvacet');
case 3:
return _('Třicet');
case 4:
return _('Čtyřicet');
case 5:
return _('Padesát');
case 6:
return _('Šedesát');
case 7:
return _('Sedmdesát');
case 8:
return _('Osmdesát');
case 9:
return _('Devadesát');
default:
throw new \LogicException();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment