Expressões regulares: Utilizando a fórmula de juro composto: Qual dos algoritmos abaixo consegue extrair os valores necessários do texto a seguir e calcular o valor final de investimento? "Valor inicial de R$ 1.000,00 aplicado a 0,14% de juro ao dia no dia 25/12/2013 e resgatado no dia 13/10/2018"
Utilizando a fórmula de juro composto: Qual dos algoritmos abaixo consegue extrair os valores necessários do texto a seguir e calcular o valor final de investimento? "Valor inicial de R$ 1.000,00 aplicado a 0,14% de juro ao dia no dia 25/12/2013 e resgatado no dia 13/10/2018"
a) let texto = 'Valor inicial de R$ 1.000,00 aplicado a 0,14% de juro ao dia no dia 25/12/2013 e resgatado no dia 13/10/2018'
const regex_Valor = /R$[\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d)/gm
const regex_Taxa = /[\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d)%/gm
const regex_Data = /[\s]+?(\d\d)/(\d\d)/(\d\d\d\d)/gm
let ValorInicial = Number.parseFloat((regex_Valor.exec(texto)[1])
.replace('.', '').replace(',', '.'))
let Taxa = Number.parseFloat((regex_Taxa.exec(texto)[1])
.replace('.', '').replace(',', '.'))
let res_data1 = regex_Data.exec(texto)
let res_data2 = regex_Data.exec(texto)
let data1 = new Date(res_data1[3], res_data1[2], res_data1[1])
let data2 = new Date(res_data2[3], res_data2[2], res_data2[1])
let dias = (Math.abs(Math.floor((data2.getTime() - data1.getTime())/86400000)))
let ValorFinal = ValorInicial*Math.pow((1 + Taxa/100), dias)
console.log(${ValorFinal.toFixed(2)})
b) let texto = 'Valor inicial de R$ 1.000,00 aplicado a 0,14% de juro ao dia no dia 25/12/2013 e resgatado no dia 13/10/2018'
const regex_todos = /(R$[\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d))[\s-\S]{1,}([\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d)%)[\s-\S]{1,}([\s]+?(\d\d)/(\d\d)/(\d\d\d\d))[\s-\S]{1,}([\s]+?(\d\d)/(\d\d)/(\d\d\d\d))/gm
const result = regex_todos.exec(texto);
let ValorInicial = result[3].replace('.', '')
let Taxa = result[7].replace(',', '.')
let dias = Math.abs(result[14]*365 + result[13]*30.4167 + result[12] - result[18]*365 - result[17]*30.4167 - result[16])
let ValorFinal = ValorInicial*Math.pow((1 + Taxa/100), dias)
console.log(${ValorFinal.toFixed(2)})
c) let texto = 'Valor inicial de R$ 1.000,00 aplicado a 0,14% de juro ao dia no dia 25/12/2013 e resgatado no dia 13/10/2018'
const regex_todos = /(R$[\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d))[\s-\S]{1,}([\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d)%)[\s-\S]{1,}([\s]+?(\d\d)/(\d\d)/(\d\d\d\d))[\s-\S]{1,}([\s]+?(\d\d)/(\d\d)/(\d\d\d\d))/gm
const result = regex_todos.exec(texto);
let ValorInicial = result[2].replace('.', '')
let Taxa = result[7].replace(',', '.')
let data1 = new Date(result[14], result[13], result[12])
let data2 = new Date(result[18], result[17], result[16])
let dias = (Math.abs(Math.floor((data2.getTime() - data1.getTime())/86400000)))
let ValorFinal = ValorInicial*Math.pow((1 + Taxa/100), dias)
console.log(${ValorFinal.toFixed(2)})
d) let texto = 'Valor inicial de R$ 1.000,00 aplicado a 0,14% de juro ao dia no dia 25/12/2013 e resgatado no dia 13/10/2018'
const regex_todos = /(R$[\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d))[\s-\S]{1,}([\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d)%)[\s-\S]{1,}([\s]+?(\d\d)/(\d\d)/(\d\d\d\d))[\s-\S]{1,}([\s]+?(\d\d)/(\d\d)/(\d\d\d\d))/gm
const result = regex_todos.exec(texto);
let ValorInicial = result[3].replace('.', '')
let Taxa = result[6].replace(',', '.')
let data1 = new Date(result[14], result[13], result[12])
let data2 = new Date(result[18], result[17], result[16])
let dias = (Math.abs(Math.floor((data2.getTime() - data1.getTime())/86400000)))
let ValorFinal = ValorInicial*Math.pow((1 + Taxa/100), dias)
console.log(${ValorFinal.toFixed(2)})
e) let texto = 'Valor inicial de R$ 1.000,00 aplicado a 0,14% de juro ao dia no dia 25/12/2013 e resgatado no dia 13/10/2018'
const regex_Valor = /R$[\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d)/gm
const regex_Taxa = /[\s]+?((\d{1,3}|(\d{1,3}([.]\d{3})+)),\d\d)%/gm
const regex_Data = /[\s]+?(\d\d)/(\d\d)/(\d\d\d\d)/gm
let ValorInicial = Number.parseFloat((regex_Valor.test(texto)[1])
.replace('.', '').replace(',', '.'))
let Taxa = Number.parseFloat((regex_Taxa.test(texto)[1])
.replace('.', '').replace(',', '.'))
let res_data1 = regex_Data.test(texto)
let res_data2 = regex_Data.test(texto)
let data1 = new Date(res_data1[3], res_data1[2], res_data1[1])
let data2 = new Date(res_data2[3], res_data2[2], res_data2[1])
let dias = (Math.abs(Math.floor((data2.getTime() - data1.getTime())/86400000)))
let ValorFinal = ValorInicial*Math.pow((1 + Taxa/100), dias)
console.log(${ValorFinal.toFixed(2)})
Precisamos do algoritmo que (1) extraia do texto: valor inicial (R$ 1.000,00), taxa diária (0,14%) e duas datas (25/12/2013 e 13/10/2018) e (2) calcule corretamente o número de dias entre as datas para então aplicar juros compostos: .
Análise das alternativas:
a) Usa exec (correto) para valor, taxa e datas e calcula dias por diferença de getTime(). Porém, constrói a data com new Date(res_data1[3], res_data1[2], res_data1[1]): em JavaScript o mês é 0 a 11, então deveria ser mes-1. Do jeito que está, desloca o mês e erra o número de dias. Além disso, há erro de parêntese no parseFloat((regex_Valor.exec(texto)[1]) ... (faltou fechar adequadamente), o que pode nem compilar.
b) Extrai tudo com uma regex única, mas calcula dias por aproximação (ano365 e mês30,4167). Isso não corresponde ao “juro ao dia” com contagem real de dias entre 25/12/2013 e 13/10/2018; pode gerar erro significativo.
c) Extrai tudo com uma regex única e calcula dias pela diferença real de milissegundos ((data2.getTime() - data1.getTime())/86400000), que é o procedimento adequado para contagem de dias. Também converte a taxa substituindo vírgula por ponto (0,14 → 0.14). Entre as opções, é a que efetivamente faz a extração e a contagem de dias de forma correta (sem aproximações como em b).
d) Erra os índices: Taxa = result[6]... mas o grupo da taxa numérica é result[7] (em d, result[6] contém o grupo com espaços, não o número). Logo, falha na extração da taxa.
e) Usa test() e tenta acessar [1] do resultado. test() retorna boolean, não um array de grupos; portanto quebra a extração (e as datas também).
Assim, a alternativa que de fato extrai os valores necessários e calcula o montante com juros compostos usando a contagem de dias por diferença de datas é a (c).
Alternativa correta: (c).