Código:
Mi idea era traducir la fórmula a PHP y luego calcularla con eval; sé que no es muy recomendable ejecutar con eval código ingresado por el usuario por temas de seguridad, pero en este caso eso no es problema.=SI(Ausentes<5; REDONDEAR(SueldoBase; 2); 0)
Pensé hacer una función que se encargara del problema y resolverla con preg_replace, pero estoy teniendo algunos problemas:
Código PHP:
function parseExcel($cadena='')
{
// Acceso a las variables globales:
global $fResultado, $mes, $ano;
// Reemplazo de los alias por variables:
$cadena=str_replace("SueldoBase", $fResultado['sueldo'], $cadena);
$cadena=str_replace("DiasTrabajados", $fResultado['diasTrabajadosMes'], $cadena);
$cadena=str_replace("DiasMes", date("t", strtotime($ano."-".$mes."-1")), $cadena);
$cadena=str_replace("Ausentes", date("t", strtotime($ano."-".$mes."-1"))-$fResultado['diasTrabajadosMes'], $cadena);
// Reemplazo de las reglas;
$cadena=preg_replace("/[ ]*SI[ ]*\([ ]*([^\);]*?)[ ]*;[ ]*([^\);]*?)[ ]*;[ ]*([^\);]*?)[ ]*\)/miU", "(\\1)?\\2:\\3", $cadena);
$cadena=preg_replace("/[ ]*REDONDEAR[ ]*\([ ]*([^\);]*?)[ ]*;[ ]*([^\);]*?)[ ]*\)/miU", "round(\\1, \\2)", $cadena);
// Para que el = tenga sentido...
$cadena="\$aux".$cadena.";";
// Imprimimos la expresión para debug
// echo $cadena."<br />";
// Evalua la expresión y devuelve el resultado
eval($cadena);
return $aux;
}
Código:
, con la siguiente info: =SI(Ausentes<5; REDONDEAR(SueldoBase; 2); 0)
Código PHP:
$mes=10;
$ano=2009;
$fResultado=array(
'sueldo'=>2555.35,
'diasTrabajadosMes'=>28
);
Código PHP:
$aux=(3<5)?round(2555.35 * 0.1:1, 0);
Código PHP:
$aux=(3<5)?round(2555.35 * 0.1, 1):0;
Me parece que no vale la pena desarrollar un autómata para esta labor; también se me ocurrió intentar detectar los paréntesis e ir llamando la función (sería otra la función, obvio) recursivamente para justamente poder ordenar bien las funciones Excel anidadas
![Pensando](http://static.forosdelweb.com/fdwtheme/images/smilies/scratchchin.gif)
¡Ayúdenme por favor! ¡Gracias!
![Adios](http://static.forosdelweb.com/fdwtheme/images/smilies/adios.gif)