332 lines
9.4 KiB
PHP
332 lines
9.4 KiB
PHP
<?php
|
||
/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
|
||
//
|
||
// +----------------------------------------------------------------------+
|
||
// | PHP version 4 |
|
||
// +----------------------------------------------------------------------+
|
||
// | Copyright (c) 1997-2003 The PHP Group |
|
||
// +----------------------------------------------------------------------+
|
||
// | This source file is subject to version 3.0 of the PHP license, |
|
||
// | that is bundled with this package in the file LICENSE, and is |
|
||
// | available at through the world-wide-web at |
|
||
// | http://www.php.net/license/3_0.txt. |
|
||
// | If you did not receive a copy of the PHP license and are unable to |
|
||
// | obtain it through the world-wide-web, please send a note to |
|
||
// | license@php.net so we can mail you a copy immediately. |
|
||
// +----------------------------------------------------------------------+
|
||
// | Authors: Marcelo Subtil Marcal <jason@conectiva.com.br>, Mario H.C.T. <mariolinux@mitus.com.br>
|
||
// +----------------------------------------------------------------------+
|
||
//
|
||
// $Id: lang.pt_BR.php,v 1.4 2005/09/18 19:52:22 makler Exp $
|
||
//
|
||
// Numbers_Words class extension to spell numbers in Brazilian Portuguese language.
|
||
//
|
||
|
||
|
||
/**
|
||
* Class for translating numbers into Brazilian Portuguese.
|
||
*
|
||
* @author Marcelo Subtil Marcal <jason@conectiva.com.br>
|
||
* @package Numbers_Words
|
||
*/
|
||
|
||
/**
|
||
* Include needed files
|
||
*/
|
||
require_once "Numbers/Words.php";
|
||
|
||
/**
|
||
* Class for translating numbers into Brazilian Portuguese.
|
||
*
|
||
* @author Marcelo Subtil Marcal <jason@conectiva.com.br>
|
||
* @package Numbers_Words
|
||
*/
|
||
class Numbers_Words_pt_BR extends Numbers_Words
|
||
{
|
||
|
||
/**
|
||
* Locale name
|
||
* @var string
|
||
* @access public
|
||
*/
|
||
var $locale = 'pt_BR';
|
||
|
||
/**
|
||
* Language name in English
|
||
* @var string
|
||
* @access public
|
||
*/
|
||
var $lang = 'Brazilian Portuguese';
|
||
|
||
/**
|
||
* Native language name
|
||
* @var string
|
||
* @access public
|
||
*/
|
||
var $lang_native = 'Portugu<67>s Brasileiro';
|
||
|
||
/**
|
||
* The word for the minus sign
|
||
* @var string
|
||
* @access private
|
||
*/
|
||
var $_minus = 'menos';
|
||
|
||
/**
|
||
* The word separator
|
||
* @var string
|
||
* @access private
|
||
*/
|
||
var $_sep = ' ';
|
||
|
||
/**
|
||
* The array containing the digits (indexed by the digits themselves).
|
||
* @var array
|
||
* @access private
|
||
*/
|
||
var $_unidade = array(
|
||
'',
|
||
'um',
|
||
'dois',
|
||
'tr<74>s',
|
||
'quatro',
|
||
'cinco',
|
||
'seis',
|
||
'sete',
|
||
'oito',
|
||
'nove'
|
||
);
|
||
|
||
/**
|
||
* The array containing numbers 10-19.
|
||
* @var array
|
||
* @access private
|
||
*/
|
||
var $_dezena10 = array(
|
||
'dez',
|
||
'onze',
|
||
'doze',
|
||
'treze',
|
||
'quatorze',
|
||
'quinze',
|
||
'dezesseis',
|
||
'dezessete',
|
||
'dezoito',
|
||
'dezenove'
|
||
);
|
||
|
||
/**
|
||
* The array containing numbers for 10,20,...,90.
|
||
* @var array
|
||
* @access private
|
||
*/
|
||
var $_dezena = array(
|
||
'',
|
||
'dez',
|
||
'vinte',
|
||
'trinta',
|
||
'quarenta',
|
||
'cinquenta',
|
||
'sessenta',
|
||
'setenta',
|
||
'oitenta',
|
||
'noventa'
|
||
);
|
||
|
||
/**
|
||
* The array containing numbers for hundrets.
|
||
* @var array
|
||
* @access private
|
||
*/
|
||
var $_centena = array(
|
||
'',
|
||
'cem',
|
||
'duzentos',
|
||
'trezentos',
|
||
'quatrocentos',
|
||
'quinhentos',
|
||
'seiscentos',
|
||
'setecentos',
|
||
'oitocentos',
|
||
'novecentos'
|
||
);
|
||
|
||
/**
|
||
* The sufixes for exponents (singular and plural)
|
||
* @var array
|
||
* @access private
|
||
*/
|
||
var $_expoente = array(
|
||
'',
|
||
'mil',
|
||
'milh<6C>o',
|
||
'bilh<6C>o',
|
||
'trilh<6C>o',
|
||
'quatrilh<6C>o',
|
||
'quintilh<6C>o',
|
||
'sextilh<6C>o',
|
||
'setilh<6C>o',
|
||
'octilh<6C>o',
|
||
'nonilh<6C>o',
|
||
'decilh<6C>o',
|
||
'undecilh<6C>o',
|
||
'dodecilh<6C>o',
|
||
'tredecilh<6C>o',
|
||
'quatuordecilh<6C>o',
|
||
'quindecilh<6C>o',
|
||
'sedecilh<6C>o',
|
||
'septendecilh<6C>o'
|
||
);
|
||
|
||
/**
|
||
* The currency names (based on the below links,
|
||
* informations from central bank websites and on encyclopedias)
|
||
*
|
||
* @var array
|
||
* @link http://30-03-67.dreamstation.com/currency_alfa.htm World Currency Information
|
||
* @link http://www.jhall.demon.co.uk/currency/by_abbrev.html World currencies
|
||
* @link http://www.shoestring.co.kr/world/p.visa/change.htm Currency names in English
|
||
* @access private
|
||
*/
|
||
var $_currency_names = array(
|
||
'BRL' => array(array('rea'), array('centavo')) );
|
||
|
||
/**
|
||
* The default currency name
|
||
* @var string
|
||
* @access public
|
||
*/
|
||
var $def_currency = 'BRL'; // Real
|
||
|
||
// {{{ toWords()
|
||
|
||
/**
|
||
* Converts a number to its word representation
|
||
* in Brazilian Portuguese language
|
||
*
|
||
* @param integer $num An integer between -infinity and infinity inclusive :)
|
||
* that need to be converted to words
|
||
*
|
||
* @return string The corresponding word representation
|
||
*
|
||
* @access public
|
||
* @author Marcelo Subtil Marcal <jason@conectiva.com.br>
|
||
* @since PHP 4.2.3
|
||
*/
|
||
function toWords($num) {
|
||
|
||
$ret = '';
|
||
|
||
$num = trim($num);
|
||
|
||
if (substr($num, 0, 1) == '-') {
|
||
$ret = $this->_sep . $this->_minus;
|
||
$num = substr($num, 1);
|
||
}
|
||
|
||
// strip excessive zero signs and spaces
|
||
$num = trim($num);
|
||
$num = preg_replace('/^0+/','',$num);
|
||
|
||
while (strlen($num) % 3 != 0) {
|
||
$num = "0" . $num;
|
||
}
|
||
|
||
$num = ereg_replace("(...)", "\\1.", $num);
|
||
$num = ereg_replace("\.$", "", $num);
|
||
|
||
$inteiro = explode(".", $num);
|
||
|
||
for ($i = 0; $i < count($inteiro); $i++) {
|
||
$ret .= (($inteiro[$i] > 100) && ($inteiro[$i] < 200)) ? "cento" : $this->_centena[$inteiro[$i][0]];
|
||
$ret .= ($inteiro[$i][0] && ($inteiro[$i][1] || $inteiro[$i][2])) ? " e " : "";
|
||
$ret .= ($inteiro[$i][1] < 2) ? "" : $this->_dezena[$inteiro[$i][1]];
|
||
$ret .= (($inteiro[$i][1] > 1) && ($inteiro[$i][2])) ? " e " : "";
|
||
$ret .= ($inteiro > 0) ? ( ($inteiro[$i][1] == 1) ? $this->_dezena10[$inteiro[$i][2]] : $this->_unidade[$inteiro[$i][2]] ) : "";
|
||
$ret .= $inteiro[$i] > 0 ? " " . ($inteiro[$i] > 1 ? str_replace("<EFBFBD>o", "<EFBFBD>es", $this->_expoente[count($inteiro)-1-$i]) : $this->_expoente[count($inteiro)-1-$i]) : "";
|
||
|
||
if ($ret && (isset($inteiro[$i+1]))) {
|
||
if ($inteiro[$i+1] != "000") {
|
||
$ret .= ($i+1) == (count($inteiro)-1) ? " e " : ", ";
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
return $ret ? " $ret" : " zero";
|
||
|
||
}
|
||
|
||
// }}}
|
||
// {{{ toCurrencyWords()
|
||
|
||
/**
|
||
* Converts a currency value to its word representation
|
||
* (with monetary units) in Portuguese language
|
||
*
|
||
* @param integer $int_curr An international currency symbol
|
||
* as defined by the ISO 4217 standard (three characters)
|
||
* @param integer $decimal A money total amount without fraction part (e.g. amount of dollars)
|
||
* @param integer $fraction Fractional part of the money amount (e.g. amount of cents)
|
||
* Optional. Defaults to false.
|
||
* @param integer $convert_fraction Convert fraction to words (left as numeric if set to false).
|
||
* Optional. Defaults to true.
|
||
*
|
||
* @return string The corresponding word representation for the currency
|
||
*
|
||
* @access public
|
||
* @author Mario H.C.T. <mariolinux@mitus.com.br>
|
||
* @since Numbers_Words 0.10.1
|
||
*/
|
||
function toCurrencyWords($int_curr, $decimal, $fraction = false, $convert_fraction = true) {
|
||
$int_curr = strtoupper($int_curr);
|
||
if (!isset($this->_currency_name[$int_curr])){
|
||
$int_curr = $this->def_currency;
|
||
}
|
||
$curr_names = $this->_currency_names[$int_curr];
|
||
$ret = trim($this->toWords($decimal));
|
||
$lev = ($decimal == 1) ? 0 : 1;
|
||
if ($lev > 0) {
|
||
if (count($curr_names[0]) > 1) {
|
||
$ret .= $this->_sep . $curr_names[0][$lev];
|
||
} else {
|
||
if ($int_curr == "BRL")
|
||
$ret .= $this->_sep . $curr_names[0][0] . 'is';
|
||
else
|
||
$ret .= $this->_sep . $curr_names[0][0] . 's';
|
||
}
|
||
} else {
|
||
if ($int_curr == "BRL")
|
||
$ret .= $this->_sep . $curr_names[0][0] . 'l';
|
||
else
|
||
$ret .= $this->_sep . $curr_names[0][0];
|
||
}
|
||
|
||
if ($fraction !== false) {
|
||
if ($int_curr == "BRL")
|
||
$ret .= $this->_sep . 'e';
|
||
|
||
if ($convert_fraction) {
|
||
$ret .= $this->_sep . trim($this->toWords($fraction));
|
||
} else {
|
||
$ret .= $this->_sep . $fraction;
|
||
}
|
||
$lev = ($fraction == 1) ? 0 : 1;
|
||
if ($lev > 0) {
|
||
if (count($curr_names[1]) > 1) {
|
||
$ret .= $this->_sep . $curr_names[1][$lev];
|
||
} else {
|
||
$ret .= $this->_sep . $curr_names[1][0] . 's';
|
||
}
|
||
} else {
|
||
$ret .= $this->_sep . $curr_names[1][0];
|
||
}
|
||
}
|
||
|
||
return $ret;
|
||
}
|
||
// }}}
|
||
}
|
||
|
||
?>
|