<template>
<div class="app">
<b-container fluid class="mt-5 mb-5">
<b-row>
<b-col>
<h1>Codificador de números romanos a decimal</h1>
</b-col>
<b-col>
<b-form v-model="input" @input="handleChange">
<b-form-group>
<label for="exampleInputEmail1">Número romanizado:</label>
<b-form-control type="text" id="exampleInputEmail1" aria-describedby="emailHelp" v-model="input" required></b-form-control>
<small id="emailHelp" class="form-text text-muted">Ingrese un número romanizado.</small>
</b-form-group>
<b-button type="submit" @click.prevent="convert">Convertir</b-button>
</b-form>
</b-col>
</b-row>
<hr>
<b-container fluid>
<b-row>
<b-col>
<h3>Resultado:</h3>
</b-col>
<b-col>
<p v-if="result" class="text-success">{{ result }}</p>
<p v-else class="text-danger">Error. El número romanizado no es válido.</p>
</b-col>
</b-row>
</b-container>
</div>
</div>
</template>
<script lang='ts'>
export default {
data() {
return {
input: '',
result: null
}
},
methods: {
handleChange(e) {
this.input = e.target.value
},
convert() {
const romanToDecimal = (roman: string): number => {
let decimal = 0;
for(let i = 0; i < roman.length; i++) {
if(i + 1 < roman.length && roman[i] <= roman[i+1]) {
decimal -= this.romanToDecimal(roman.slice(i, i+2));
} else {
decimal += this.romanToDecimal(roman.slice(i, i+1));
}
}
return decimal;
}
if(this.input.match(/^[A-Za-z]+$/)) {
const roman = this.input.toUpperCase();
this.result = romanToDecimal(roman);
} else {
this.result = null;
}
}
}
}
</script>
<style>
</style>