freedom-js-support
Version:
Freedom Javascript Utilities
216 lines (210 loc) • 6.51 kB
JavaScript
import dateUtil from './date'
const formatter = {
emptyValues:['',null,undefined,NaN],
roundNumber(num, precision) {
if(!("" + num).includes("e")) {
return +(Math.round(num + "e+" + precision) + "e-" + precision);
}
var arr = ("" + num).split("e");
var sig = ""
if(+arr[1] + precision > 0) {
sig = "+";
}
return +(Math.round(+arr[0] + "e" + sig + (+arr[1] + precision)) + "e-" + precision);
},
getJapanese(value){
var match = value
.match(/[\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFFEF\u4E00-\u9FAF\u2605-\u2606\u2190-\u2195]|Tab/)
value = value.replace(match,'');
return value;
},
getObjectParameters(param,addon={}){
let [format, ...parameters] = param.split('|');
let options = Object.assign(parameters.reduce((obj,option)=>{
let [key,args] = option.split(':');
obj[key] = args.split(',');
return obj
},{}),addon);
return {format,options};
},
toHalfWidth(value){
if(this.isEmpty(value)){
return;
}
return value.toString().replace(/[\uff01-\uff5e]/g, (s)=>{
return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
})
},
isEmpty(value,type="text"){
if(this.emptyValues.includes(value) || value === '-'){
return true;
}
switch(type){
case 'decimal':
case 'float':
case 'double':
case 'integer':
case 'number':
return isNaN( Number(value.toString().replace(/\D/g,'')) );
}
return false;
},
checkDefault(a,b,format){
if(( ( a === '' || a === undefined || a === null ) && b === 0 ) ||
( b === '' || b === undefined || b === null ) && a === 0 ){
return '';
}
if( Number(a) === 0 && Number(b) === 0){
return 0;
}
},
format(value,type,options={}){
options = Object.assign({suffix:'',prefix:''},options)
var { suffix,prefix } = options
if(this.isEmpty(value,type)){
return value;
}
switch(type){
case 'integer':
case 'number':
value = this.formatNumber(value,options);
break;
case 'currency':
value = this.formatCurrency(value,options);
break;
case 'date':
value = this.formatDate(value,options);
break;
case 'float':
case 'double':
case 'decimal':
value = this.formatDecimal(value,options);
break;
case 'percentage':
value = this.formatPercentage(value,options);
break;
}
return `${prefix}${value.toString()}${suffix}`
},
formatDate(value,options){
if(typeof options.fromString != 'undefined'){
return dateUtil.fromString(value,options);
}
return dateUtil.format(value,options);
},
formatPercentage(value,{multiplier=1,precision=2,symbol="%" }={}){
if(value == "-"){
return value;
}
var number = this.formatDecimal(value,{precision,multiplier});
return `${number}${ symbol }`;
},
formatNumber(value){
if(value == "-"){
return value;
}
value = this.toHalfWidth(value)
return this.getNumber(value).toLocaleString('en');;
},
formatDecimal(value,{ precision=8,stringify=true ,multiplier=1}={}){
if(value == "-" || value == '.'){
return value;
}
var number = this.getNumber(value)
var point = this.getPoint(value,precision)
var result = parseFloat(number+ point).toFixed(precision) * multiplier;
if(this.isEmpty(result)){
return '';
}
return stringify ? result.toLocaleString('en') : result;
},
formatCurrency(value,{ currency="$" }={}){
var number = this.getNumber(value);
if(!isNaN(number)){
number = Number(number).toLocaleString('en');
}
return currency+number;
},
getNumber(value,{type='signed'}={}){
if(this.isEmpty(value) || value == "-"){
return value;
}
// convert number to half width characters
// remove characters after the decimal point
var number = this.toHalfWidth(value).split('.')[0];
if(type != 'signed'){
number = number.replace(/[^\d]/g,'')
}else{
//fix the sign character
number = `${number.replace(/[^+-]/g,'')}${number.replace(/\D/g,'')}`
}
return Number(number);
},
getPoint(value,{type='signed',precision=8}={}){
if(!Boolean(value)){
return 0;
}
// convert number to half width characters
// remove characters before the decimal point
value = this.toHalfWidth(value);
var number = value.split('.').slice(1).join('')
if(type != 'signed'){
number = `0.${number.replace(/[^\d]/g,'')}`
}else{
//fix the sign character
number = `${value.replace(/[^+-]/g,'')}0.${number.replace(/\D/g,'')}`
}
if(isNaN(Number(number))){
return 0;
}
return parseFloat(number).toFixed(precision) * 1;
},
getDecimal(value){
if(this.emptyValues.includes(value)){
return value;
}
var number = this.getNumber(value) + this.getPoint(value);
return this.isEmpty(number,'decimal') ? '' : parseFloat(number);
},
getDate (value, options={}) {
return dateUtil.fromString(value, options)
},
getValue(value,type,options={}){
if(this.isEmpty(value,type)){
return value;
}
switch(type){
case 'digit':
return value.replace(/[^\d]/g,''); break;
case 'integer':
case 'percentage':
case 'number':
return this.getNumber(value,options); break;
case 'currency':
case 'double':
case 'decimal':
case 'float':
return this.getDecimal(value,options); break;
case 'date':
return this.getDate(value,options); break;
}
return value;
},
}
export const VUE_INSTALLER = (Vue) => {
if(Vue._formatter){
return;
}
Vue._formatter = formatter
Vue.filter('format',(value,type,options)=>{
return formatter.format(value,type,options)
})
Object.defineProperties(Vue.prototype,{
$_formatter:{
get:() => {
return Vue._formatter;
}
}
})
}
export default formatter;