Fala, galera.
Estou desenvolvendo um programinha de cadastro automático de produtos. Além de gerar todas as combinações possíveis dado os atributos do mesmo, ele calcula preço e peso através de uma fórmula.
Para ler a fórmula eu usei o shell.evaluate() da GroovyShell, mas tenho uma dúvida.
Ele faz o cálculo perfeitamente, mas quero fazer uma validação pra isso.
No código, as siglas da fórmula são substituidas de acordo com as siglas de atributos cadastrados.
A minha ideia de validação é: Caso uma ou mais siglas deixem de ser traduzidas (que significaria que o usuário digitou uma fórmula inválida para aquele produto), ao invés de dar erro ou exceção, o sistema simplesmente retorna um false qualquer.
Segue o código:
private double calculaPreco(Map<String, Object[]> mapa) {
formula = "(((LA/100)*(CO/100)*(ES)*PesoChapa*NP*PrecoChapa*Lucro)*3)";
formula += "+(0.05+0.05)*PesoChapa*1.5*(AL/100)*17*Lucro*4";
TreeMap treemap = new TreeMap(mapa);
Set<String> chaves = treemap.keySet();
for (String chave : chaves){
Object arfs[] = (Object[]) treemap.get(chave);
MAttribute ma = (MAttribute)arfs[0];
MAttributeValue mav = (MAttributeValue)arfs[1];
formula = formula.replaceAll((String)ma.get_Value("tipo"), mav.getName());
}
formula = formula.replaceAll("PesoChapa", "8");
formula = formula.replaceAll("PrecoChapa", "18");
formula = formula.replaceAll("Lucro", "2.8");
Binding binding = new Binding();
GroovyShell shell = new GroovyShell(binding);
String tancredoNeves = shell.evaluate(formula).toString();
double valor = Double.parseDouble(tancredoNeves);
return Math.ceil(valor);
}