Como converter uma String para Double em JasperReports?

Bom dia a todos!

Tenho o seguinte gráfico:

Neste gráfico preciso exibir a porcentagem correspondente de cada venda ao valor total do relatório.

Exemplo:

Então para isso basta criar um variável dentro do próprio relatório, que faça a divisão da variável que recebe o valor da compra, pela variável que recebe o valor total do relatório e o resultado gerado seja multiplicado por 100

O meu problema é o seguinte, a variável que recebe o valor de cada venda é uma String: $F{valor_total_venda}

e a variável que recebe o valor total do relatório é Double $V{SOMA}:

Já pesquisei aos montes alguma forma de conversão, e encontrei varias coisas, mas nada funcionou, alguém poderia me orientar em como fazer isso?

Tu pode tentar fazer algo assim dentro da expressão onde o valor será usado:

Double.valueOf($F{valor_total_venda})

tbm tentei isso:

new Double($F{valor_total_venda}.doubleValue() / $V{SOMA})

mas recebo isso:

e isso tbm:

new Double(Double.parseDouble($F{valor_total_venda}.doubleValue() / $V{SOMA}))

e por fim isso:

new Double(Double.parseDouble($F{valor_total_venda} / $V{SOMA}))

Tente usar BigDecimal dessa forma para ver se vai:

new BigDecimal($F{valor_total_venda}).divide(new BigDecimal($V{SOMA}))

$V{SOMA} é de que tipo?

Soma é do tipo Double

To achando que vai ser preciso converter de volta pra string após o cálculo. Tente adicionar um toString no final para ver se pelo menos muda o erro:

new BigDecimal($F{valor_total_venda}).divide(new BigDecimal($V{SOMA})).toString()

nada meu amigo…

Veja se há algum outro log com o detalhe do erro. Deve ter em algum lugar algum texto explicando se foi um erro de sintaxe ou se está faltando algo. Essa mensagem que está aparecendo está muito vaga.

Manda um print do lugar onde vc está editando a expressão.

Passo a Passo:

1º Clico em Percentage - ao lado direito

2º Coloco a pecentage ao lado do grafico, e abre-se esta janela:

3º Clico em Finish

4º clico 2x sobre a expressao

e abre-se a janela:

5º nesta janela coloco a sua exporessao:

e clico em finish

6º clico em preview e recebo o erro(que por sinal agora é outro erro)

Tente assim:

String.valueOf(new BigDecimal($F{valor_total_venda}).divide(new BigDecimal($V{SOMA}), RoundingMode.DOWN))

Se vc clicar na aba inferior Text (um pouco mais abaixo do erro), vc conseguirá ver o detalhes da exceção. Vc pode copiar o texto da exceção e postar aqui.

net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: String.valueOf(new BigDecimal($F{valor_total_venda}).divide(new BigDecimal($V{SOMA}), RoundingMode.DOWN))
	at com.jaspersoft.studio.editor.preview.view.control.ReportController.fillReport(ReportController.java:551)
	at com.jaspersoft.studio.editor.preview.view.control.ReportController.access$18(ReportController.java:526)
	at com.jaspersoft.studio.editor.preview.view.control.ReportController$1.run(ReportController.java:444)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: String.valueOf(new BigDecimal($F{valor_total_venda}).divide(new BigDecimal($V{SOMA}), RoundingMode.DOWN))
	at net.sf.jasperreports.engine.fill.JREvaluator.handleEvaluationException(JREvaluator.java:294)
	at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:328)
	at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:673)
	at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:641)
	at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:1173)
	at net.sf.jasperreports.engine.fill.JRFillTextField.evaluateText(JRFillTextField.java:555)
	at net.sf.jasperreports.engine.fill.JRFillTextField.resolveElement(JRFillTextField.java:1056)
	at net.sf.jasperreports.engine.fill.JRFillElement.performDelayedEvaluation(JRFillElement.java:1140)
	at net.sf.jasperreports.engine.fill.JRFillElement.delayedEvaluate(JRFillElement.java:1479)
	at net.sf.jasperreports.engine.fill.JRFillElement.resolveElement(JRFillElement.java:1239)
	at net.sf.jasperreports.engine.fill.ElementEvaluationAction.execute(ElementEvaluationAction.java:69)
	at net.sf.jasperreports.engine.fill.DelayedFillActions.runActions(DelayedFillActions.java:271)
	at net.sf.jasperreports.engine.fill.BaseReportFiller.resolveBoundElements(BaseReportFiller.java:807)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.resolveReportBoundElements(JRBaseFiller.java:1209)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillSummary(JRVerticalFiller.java:1238)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportEnd(JRVerticalFiller.java:308)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:622)
	at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFill.run(BaseFillHandle.java:135)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NumberFormatException: Character R is neither a decimal digit number, decimal point, nor "e" notation exponential mark.
	at java.base/java.math.BigDecimal.<init>(Unknown Source)
	at java.base/java.math.BigDecimal.<init>(Unknown Source)
	at java.base/java.math.BigDecimal.<init>(Unknown Source)
	at Simple_Blue_1626195830545_269357.evaluate(Simple_Blue_1626195830545_269357:113)
	at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:313)
	... 18 more

Eita, deve tah sendo retornado algum número inválido, ou no valor_total_venda ou na SOMA. Será que vc não está retornando um R$ no valor não?

Por exemplo, ao tentar fazer isso:

new BigDecimal("R$200.00");

o erro que estoura é exatamente esse:

Exception in thread "main" java.lang.NumberFormatException: Character R is neither a decimal digit number, decimal point, nor "e" notation exponential mark.

Na linha 113 do xml:

<textElement verticalAlignment="Middle">

Na linha 313:

<textField textAdjust="StretchHeight" pattern="R$ #,##0.###;#,##0.###-">

não sei te responder