From b569e5bd0eedb2105fc3f2acf6d687a5c28a577a Mon Sep 17 00:00:00 2001 From: Renato Moura Date: Wed, 25 Jan 2017 10:21:10 -0200 Subject: [PATCH] Criado Class Locale --- composer.json | 4 +- src/NwLaravel/Locale/Locale.php | 209 ++++++++++++++++++++++++++++++++ tests/Locale/LocaleTest.php | 102 ++++++++++++++++ 3 files changed, 313 insertions(+), 2 deletions(-) create mode 100644 src/NwLaravel/Locale/Locale.php create mode 100644 tests/Locale/LocaleTest.php diff --git a/composer.json b/composer.json index a699d23..d524ea5 100644 --- a/composer.json +++ b/composer.json @@ -9,8 +9,8 @@ } ], "require": { - "php": ">=5.6.0", - "laravel/framework": "5.2.*|5.3.*", + "php": ">=5.6.4", + "laravel/framework": "~5.0", "prettus/l5-repository": "^2.1", "prettus/laravel-validation": "^1.1", "guzzlehttp/guzzle": "~6.0", diff --git a/src/NwLaravel/Locale/Locale.php b/src/NwLaravel/Locale/Locale.php new file mode 100644 index 0000000..89cd20d --- /dev/null +++ b/src/NwLaravel/Locale/Locale.php @@ -0,0 +1,209 @@ += 1000) { + return $number.'º'; + } + + $translate = self::translate($currency, $ordinals); + + $number = number_format($number, 2, ".", "."); + $inteiro = explode(".", $number); + for ($i=0;$i 0 ? 1 : 2); + $rt = ''; + $z = 0; + for ($i=0;$i 100) && ($number < 200)) { + $rc = $translate['cento']; + } else { + $rc = $translate['centanas'][$number[0]]; + } + + if ($number[1] < 2) { + $rd = ""; + } else { + $rd = $translate['dezenas'][$number[1]]; + } + + if ($number > 0) { + if ($number[1] == 1) { + $ru = $translate['dezenas10'][$number[2]]; + } else { + $ru = $translate['unidades'][$number[2]]; + } + } else { + $ru = ""; + } + + $r = $rc; + if ($rc && ($rd || $ru)) { + $r .= $translate['separator']; + } + + $r .= $rd; + if ($rd && $ru) { + $r .= $translate['separator']; + } + + $r .= $ru; + + $t = count($inteiro)-1-$i; + + if ($r) { + $r .= " "; + if ($number > 1) { + $r .= $translate['plural'][$t]; + } else { + $r .= $translate['singular'][$t]; + } + } + + if ($number == "000") { + $z++; + } elseif ($z > 0) { + $z--; + } + + if (($t==1) && ($z>0) && ($inteiro[0] > 0)) { + if ($z > 1) { + $r .= $translate['preposicao']; + } + + $r .= $translate['plural'][$t]; + } + + if ($r) { + $rt = $rt; + if (($i > 0) && ($i <= $fim) && ($inteiro[0] > 0) && ($z < 1)) { + + $rt .= (!$currency && $t == 0 && $i==$fim) ? ', ' : $translate['separator']; + + } else { + if ($t == 0 && $rt) { + $rt .= $currency ? $translate['separator'] : ', '; + } else { + $rt .= " "; + } + } + + $rt .= $r; + } + } + + $rt = preg_replace("/\s+/", " ", $rt); + $rt = preg_replace("/\s+,\s*/", ", ", $rt); + + return trim($rt) ?: $translate['zero']; + } + + /** + * Ufs + * + * @return array + */ + public static function states() + { + return config('locales.ufs'); + } + + /** + * Sigla Ufs + * + * @return array + */ + public static function siglaStates() + { + $keys = array_keys(self::ufs()); + return array_combine($keys, $keys); + } +} \ No newline at end of file diff --git a/tests/Locale/LocaleTest.php b/tests/Locale/LocaleTest.php new file mode 100644 index 0000000..0fdf78e --- /dev/null +++ b/tests/Locale/LocaleTest.php @@ -0,0 +1,102 @@ +assertEquals($expected, Locale::extensoOrdinal($number)); + } + + public function providerOrdinals() + { + return [ + ['décimo', ' 10.00 '], + ['10,00', '10,00'], + ['-', 0], + ['primeiro', 1.33], + ['vigésimo primeiro', 21], + ['1000º', 1000], + ['nongentésimo nonagésimo nono', 999], + ['103580º', 103580.10], + ['centésimo décimo sétimo', 117], + ['centésimo', 100], + ['quarto', 4], + ]; + } + + /** + * @dataProvider providerCardinals + */ + public function testExtensoCardinal($expected, $number) + { + $this->assertEquals($expected, Locale::extensoCardinal($number)); + } + + public function providerCardinals() + { + return [ + ['dez', ' 10.00 '], + ['10,00', '10,00'], + ['zero', 0], + ['treze', 13], + ['vinte e um', 21], + ['cento e dois', 102], + ['um mil e trinta e nove', 1039], + ['cento e tres mil e quinhentos e oitenta', 103580], + ['cento e dezessete', 117], + ['cem', 100], + ['quatro', 4], + ['oito mil', 8000], + ['oitenta mil', 80000], + ['oitocentos mil', 800000], + ['oito milhões', 8000000], + ['cem, onze', 100.11], + ['onze mil e trezentos e sessenta e quatro, oitenta e nove', 11364.89], + ['um milhão, quarenta e quatro', 1000000.44], + ['um milhão e duzentos mil, quarenta e quatro', 1200000.44], + ]; + } + + /** + * @dataProvider providerCurrencies + */ + public function testExtensoCurrency($expected, $number) + { + $this->assertEquals($expected, Locale::extensoCurrency($number)); + } + + public function providerCurrencies() + { + return [ + ['um real', 1], + ['dez reais', ' 10.00 '], + ['10,00', '10,00'], + ['zero reais', 0], + ['setenta e sete centavos', 0.77], + ['um centavo', 0.01], + ['vinte e um reais', 21.00], + ['cem reais', 100.00], + ['cem reais e doze centavos', 100.12], + ['um mil e trinta e nove reais e quarenta e tres centavos', 1039.43], + ['cento e tres mil e quinhentos e oitenta reais e um centavo', 103580.01], + ['cento e dezessete reais e sessenta e sete centavos', 117.67], + ['cem reais e dezessete centavos', 100.17], + ['quatro reais e noventa e nove centavos', 4.99], + ['um milhão de reais e quarenta e quatro centavos', 1000000.44], + ['cem milhões de reais', 100000000], + ['um milhão e duzentos mil reais e quarenta e quatro centavos', 1200000.44], + ['oito mil reais', 8000], + ['oitenta mil reais', 80000], + ['oitocentos mil reais', 800000], + ['oito milhões de reais', 8000000], + ]; + } +}