Advertisement
info1atual

Campo valor em Vuejs

Jan 30th, 2021
1,094
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <template>
  2.   <v-text-field
  3.     autocomplete="off"
  4.     :class="{'direita': direita}"
  5.     v-bind="$attrs"
  6.     ref="input"
  7.     v-model="valor"
  8.     @input="onInput"
  9.     @focus="onFocus"
  10.     @blur="onBlur"
  11.     @keyup="$emit('keyup', $event)"
  12.   ></v-text-field>
  13. </template>
  14.  
  15. <script>
  16. export default {
  17.   name: "campo-valor",
  18.   props: {
  19.     value: {},
  20.     decimais: {
  21.       type: [String, Number],
  22.       default: 2,
  23.     },
  24.     selectOnFocus: {
  25.       type: Boolean,
  26.       default: true,
  27.     },
  28.     direita: {
  29.       type: Boolean,
  30.       default: true,
  31.     },
  32.   },
  33.  
  34.   data() {
  35.     return {
  36.       valor: "0,00",
  37.       internalChange: false,
  38.       isFocused: false,
  39.     };
  40.   },
  41.  
  42.   mounted() {
  43.     this.valor = this.formataNumero(this.value, this.decimais);
  44.   },
  45.  
  46.   methods: {
  47.     onInput(value) {
  48.       this.internalChange = true;
  49.       this.$emit("input", this.valorUS(this.valor));
  50.     },
  51.  
  52.     onBlur() {
  53.       this.internalChange = false;
  54.       this.isFocused = false;
  55.       this.valor = this.formataNumero(this.value, this.decimais);
  56.     },
  57.  
  58.     onFocus(e) {
  59.       this.isFocused = true;
  60.       if (this.selectOnFocus) {
  61.         e.target.selectionStart = 0;
  62.         e.target.selectionEnd = e.target.value.length;
  63.       } else {
  64.         setTimeout(() => {
  65.           if (!this.disabled || !this.readonly) {
  66.             e.target.setSelectionRange(
  67.               e.target.value.length,
  68.               e.target.value.length
  69.             );
  70.           }
  71.         }, 0);
  72.       }
  73.     },
  74.  
  75.     focus() {
  76.       this.$refs.input.focus();
  77.     },
  78.  
  79.     valorUS(valor) {
  80.       if (valor) {
  81.         return parseFloat(valor.replace(/\./g, "").replace(",", "."));
  82.       }
  83.     },
  84.  
  85.     valorBR(valor) {
  86.       if (valor) {
  87.         return valor.toString().replace(/\./g, ",");
  88.       }
  89.     },
  90.  
  91.     trunc(valor, decimais) {
  92.       decimais = !decimais ? 2 : decimais;
  93.       valor = valor.replace(/\./g, "").replace(",", ".");
  94.       valor =
  95.         Math.trunc(parseFloat(valor) * Math.pow(10, decimais)) /
  96.         Math.pow(10, decimais);
  97.       return valor;
  98.     },
  99.  
  100.     formataNumero(number, decimals, dec_point, thousands_sep) {
  101.       decimals = typeof decimals !== "undefined" ? decimals : 2;
  102.       dec_point = typeof dec_point !== "undefined" ? dec_point : ",";
  103.       thousands_sep =
  104.         typeof thousands_sep !== "undefined" ? thousands_sep : ".";
  105.  
  106.       number = (number + "").replace(/[^0-9+\-Ee.]/g, "");
  107.       var n = !isFinite(+number) ? 0 : +number,
  108.         prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
  109.         sep = typeof thousands_sep === "undefined" ? "," : thousands_sep,
  110.         dec = typeof dec_point === "undefined" ? "." : dec_point,
  111.         s = "",
  112.         toFixedFix = function (n, prec) {
  113.           var k = Math.pow(10, prec);
  114.           return "" + (Math.round(n * k) / k).toFixed(prec);
  115.         },
  116.         toFixedFix2 = function (n, prec) {
  117.           return (
  118.             "" + (Math.trunc(n * 1000000000000) / 1000000000000).toFixed(prec)
  119.           );
  120.         };
  121.       // Fix for IE parseFloat(0.55).toFixed(0) = 0;
  122.       s = (prec ? toFixedFix2(n, prec) : "" + Math.round(n)).split(".");
  123.       if (s[0].length > 3) {
  124.         s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
  125.       }
  126.       if ((s[1] || "").length < prec) {
  127.         s[1] = s[1] || "";
  128.         s[1] += new Array(prec - s[1].length + 1).join("0");
  129.       }
  130.       return s.join(dec);
  131.     },
  132.   },
  133.  
  134.   watch: {
  135.     value(val, oldval) {
  136.       if (!this.internalChange) {
  137.         this.valor = this.formataNumero(val, this.decimais);
  138.       }
  139.     },
  140.   },
  141. };
  142. </script>
  143.  
  144. <style scoped>
  145. .direita.v-input >>> input {
  146.   text-align: right !important;
  147. }
  148. </style>
  149.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement