Location: PHPKode > scripts > Numero a Letra > numero-a-letra/CNumeroaLetra.php
<?php
/**
 * OEOG Class para convertir numeros en palabras 
 * 
 * 
 * @version   $Id: CNumeroaLetra.php,v 1.0.1 2004-10-29 13:20 ortizom Exp $
 * @author    Omar Eduardo Ortiz Garza <hide@address.com>
 * @copyright (c) 2004-2005 Omar Eduardo Ortiz Garza
 * @since     Friday, October 29, 2004
 **/
/***************************************************************************
 *
 *  Este programa es software libre; puedes redistribuir y/o modificar
 *  bajo los terminos de la GNU General Public License como se publico por
 *  la Free Software Foundation; version 2 de la Licencia, o cualquier
 *  (a tu eleccion) version posterior.
 *
 ***************************************************************************/

/***************************************************************************
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 ***************************************************************************/

class CNumeroaLetra{
/***************************************************************************
 *
 *	Propiedades:
 *	$numero:	Es la cantidad a ser convertida a letras maximo 999,999,999,999.99
 *	$genero:	0 para femenino y 1 para masculino, es util dependiendo de la
 *				moneda ej: cuatrocientos pesos / cuatrocientas pesetas
 *	$moneda:	nombre de la moneda
 *	$prefijo:	texto a imprimir antes de la cantidad 
 *	$sufijo:	texto a imprimir despues de la cantidad
 *				tanto el $sufijo como el $prefijo en la impresion de cheques o
 *				facturas, para impedir que se altere la cantidad
 *	$mayusculas: 0 para minusculas, 1 para mayusculas indica como debe 
 *				mostrarse el texto
 *	$textos_posibles: contiene todas las posibles palabras a usar
 *	$aTexto:	es el arreglo de los textos que se usan de acuerdo al genero 
 *				seleccionado
 *
 ***************************************************************************/

	private $numero=0;
	private $genero=1;
	private $moneda="PESOS";
	private $prefijo="(***";
	private $sufijo="***)";
	private $mayusculas=1;
	//textos
	private $textos_posibles= array(
	0 => array ('UNA ','DOS ','TRES ','CUATRO ','CINCO ','SEIS ','SIETE ','OCHO ','NUEVE ','UN '),
	1 => array ('ONCE ','DOCE ','TRECE ','CATORCE ','QUINCE ','DIECISEIS ','DIECISIETE ','DIECIOCHO ','DIECINUEVE ',''),
	2 => array ('DIEZ ','VEINTE ','TREINTA ','CUARENTA ','CINCUENTA ','SESENTA ','SETENTA ','OCHENTA ','NOVENTA ','VEINTI'),
	3 => array ('CIEN ','DOSCIENTAS ','TRESCIENTAS ','CUATROCIENTAS ','QUINIENTAS ','SEISCIENTAS ','SETECIENTAS ','OCHOCIENTAS ','NOVECIENTAS ','CIENTO '),
        4 => array ('CIEN ','DOSCIENTOS ','TRESCIENTOS ','CUATROCIENTOS ','QUINIENTOS ','SEISCIENTOS ','SETECIENTOS ','OCHOCIENTOS ','NOVECIENTOS ','CIENTO '),
	5 => array ('MIL ','MILLON ','MILLONES ','CERO ','Y ','UNO ','DOS ','CON ','','')
	);
	private $aTexto;

/***************************************************************************
 *
 *	Metodos:
 *	_construct:	Inicializa textos
 *	setNumero:	Asigna el numero a convertir a letra
 *  setPrefijo:	Asigna el prefijo
 *	setSufijo:	Asiga el sufijo
 *	setMoneda:	Asigna la moneda
 *	setGenero:	Asigan genero 
 *	setMayusculas:	Asigna uso de mayusculas o minusculas
 *	letra:		Convierte numero en letra
 *	letraUnidad: Convierte unidad en letra, asigna miles y millones
 *	letraDecena: Contiene decena en letra
 *	letraCentena: Convierte centena en letra
 *
 ***************************************************************************/	
	function __construct(){
		for($i=0; $i<6;$i++)
   			for($j=0;$j<10;$j++)
				$this->aTexto[$i][$j]=$this->textos_posibles[$i][$j];
	}

	function setNumero($num){
		$this->numero=(double)$num;
	}

	function setPrefijo($pre){
		$this->prefijo=$pre;
	}

	function setSufijo($sub){
		$this->sufijo=$sub;
	}

	function setMoneda($mon){
		$this->moneda=$mon;
	}

	function setGenero($gen){
		$this->genero=(int)$gen;
	}

	function setMayusculas($may){
		$this->mayusculas=(int)$may;
	}

	function letra(){
		if($this->genero==1){ //masculino
			$this->aTexto[0][0]=$this->textos_posibles[5][5];
			for($j=0;$j<9;$j++)
            	$this->aTexto[3][$j]= $this->aTexto[4][$j];

		}else{//femenino
			$this->aTexto[0][0]=$this->textos_posibles[0][0];
			for($j=0;$j<9;$j++)
            	$this->aTexto[3][$j]= $this->aTexto[3][$j];
		}

		$cnumero=sprintf("%015.2f",$this->numero);
		$texto="";
		if(strlen($cnumero)>15){
			$texto="Excede tamaño permitido";
		}else{
			$hay_significativo=false;
			for ($pos=0; $pos<12; $pos++){
				// Control existencia Dígito significativo 
   				if (!($hay_significativo)&&(substr($cnumero,$pos,1) == '0')) ;
   				else $hay_dignificativo = true;

   				// Detectar Tipo de Dígito 
   				switch($pos % 3) {
   					case 0: $texto.=$this->letraCentena($pos,$cnumero); break;
   					case 1: $texto.=$this->letraDecena($pos,$cnumero); break;
   					case 2: $texto.=$this->letraUnidad($pos,$cnumero); break;
				}
			}
   			// Detectar caso 0 
   			if ($texto == '') $texto = $this->aTexto[5][3];
			if($this->mayusculas){//mayusculas
				$texto=strtoupper($this->prefijo.$texto." ".$this->moneda." ".substr($cnumero,-2)."/100 ".$this->sufijo);	
			}else{//minusculas
				$texto=strtolower($this->prefijo.$texto." ".$this->moneda." ".substr($cnumero,-2)."/100 ".$this->sufijo);	
			}
		}
		return $texto;

	}

	public function __toString() {
		return $this->letra();
	}

	//traducir letra a unidad
	private function letraUnidad($pos,$cnumero){
		$unidad_texto="";
   		if( !((substr($cnumero,$pos,1) == '0') || 
               (substr($cnumero,$pos - 1,1) == '1') ||
               ((substr($cnumero, $pos - 2, 3) == '001') &&  (($pos == 2) || ($pos == 8)) ) 
             )
		  ){ 
			if((substr($cnumero,$pos,1) == '1') && ($pos <= 6)){
   				$unidad_texto.=$this->aTexto[0][9]; 
			}else{
				$unidad_texto.=$this->aTexto[0][substr($cnumero,$pos,1) - 1];
			}
		}
   		if((($pos == 2) || ($pos == 8)) && 
		   (substr($cnumero, $pos - 2, 3) != '000')){//miles
			if(substr($cnumero,$pos,1)=='1'){
				$unidad_texto=substr($unidad_texto,0,-2)." ";
				$unidad_texto.= $this->aTexto[5][0]; 
			}else{
				$unidad_texto.=$this->aTexto[5][0]; 
			}
		}
        if($pos == 5 && substr($cnumero, $pos - 2, 3) != '000'){
			if(substr($cnumero, 1, 6) == '000001'){//millones
			  $unidad_texto.=$this->aTexto[5][1];
			}else{
				$unidad_texto.=$this->aTexto[5][2];
			}
		}
		return $unidad_texto;
	}
	//traducir digito a decena
	private function letraDecena($pos,$cnumero){
		$decena_texto="";
   		if (substr($cnumero,$pos,1) == '0'){
			return;
		}else if(substr($cnumero,$pos + 1,1) == '0'){ 
   			$decena_texto.=$this->aTexto[2][substr($cnumero,$pos,1)-1];
		}else if(substr($cnumero,$pos,1) == '1'){ 
   			$decena_texto.=$this->aTexto[1][substr($cnumero,$pos+ 1,1)- 1];
		}else if(substr($cnumero,$pos,1) == '2'){
   			$decena_texto.=$this->aTexto[2][9];
		}else{
   			$decena_texto.=$this->aTexto[2][substr($cnumero,$pos,1)- 1] . $this->aTexto[5][4];
		}
		return $decena_texto;
   	}
	//traducir digito centena
   	private function letraCentena($pos,$cnumero){
		$centena_texto="";
   		if (substr($cnumero,$pos,1) == '0') return;
   		$pos2 = 3;
		if((substr($cnumero,$pos,1) == '1') && (substr($cnumero,$pos+ 1, 2) != '00')){
   			$centena_texto.=$this->aTexto[$pos2][9];
   		}else{
   			$centena_texto.=$this->aTexto[$pos2][substr($cnumero,$pos,1) - 1];
		}
		return $centena_texto;
	}

}
Return current item: Numero a Letra