分轉化為元 - 正則解決精度
export const regFenToYuan = (fen) =>{
var num = fen;
num=fen*0.01;
num+='';
var reg = num.indexOf('.') >-1 ? /(\d{1,3})(?=(?:\d{3})+\.)/g : /(\d{1,3})(?=(?:\d{3})+$)/g;
num=num.replace(reg,'$1');
num = toDecimal2(num)
return num
};
元轉分 - 解決精度問題 yuan:要轉換的錢,單位元; digit:轉換倍數
export const regYuanToFen = (yuan:number,digit:number) =>{
var m=0,
s1=yuan.toString(),
s2=digit.toString();
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
判斷是否最多兩位小數,正負均可
export const checkTwoPointNum = (inputNumber) => {
var partten = /^-?\d+\.?\d{0,2}$/;
return partten.test(inputNumber)
};
強制保留2位小數,如:2,會在2后面補上00.即2.00
export const toDecimal2 = (x) => {
var f = parseFloat(x);
if (isNaN(f)) {
return false;
}
var f = Math.round(x * 100) / 100;
var s = f.toString();
var rs = s.indexOf('.');
if (rs < 0) {
rs = s.length;
s += '.';
}
while (s.length <= rs + 2) {
s += '0';
}
return s;
}
金額轉為大寫漢字
export const priceUppercase= (money) => {
var cnNums = new Array("零","壹","貳","叄","肆","伍","陸","柒","捌","玖"); //漢字的數字
var cnIntRadice = new Array("","拾","佰","仟"); //基本單位
var cnIntUnits = new Array("","萬","億","兆"); //對應整數部分擴展單位
var cnDecUnits = new Array("角","分","毫","厘"); //對應小數部分單位
//var cnInteger = "整"; //整數金額時后面跟的字符
var cnIntLast = "元"; //整型完以后的單位
var maxNum = 999999999999999.9999; //最大處理的數字
var IntegerNum; //金額整數部分
var DecimalNum; //金額小數部分
var ChineseStr=""; //輸出的中文金額字符串
var parts; //分離金額后用的數組,預定義
if( money == "" ){
return "";
}
money = parseFloat(money);
if( money >= maxNum ){
// $.alert('超出最大處理數字');
return "";
}
if( money == 0 ){
//ChineseStr = cnNums[0]+cnIntLast+cnInteger;
ChineseStr = cnNums[0]+cnIntLast
//document.getElementById("show").value=ChineseStr;
return ChineseStr;
}
money = money.toString(); //轉換為字符串
if( money.indexOf(".") == -1 ){
IntegerNum = money;
DecimalNum = '';
cnIntLast = '元整'
}else{
parts = money.split(".");
IntegerNum = parts[0];
DecimalNum = parts[1].substr(0,4);
}
let zeroCount = 0;
let IntLen = 0;
let n;
let p;
let m;
let q;
let decLen = 0;
if( parseInt(IntegerNum,10) > 0 ){//獲取整型部分轉換
zeroCount = 0;
IntLen = IntegerNum.length;
for( var i=0;i<IntLen;i++ ){
n = IntegerNum.substr(i,1);
p = IntLen - i - 1;
q = p / 4;
m = p % 4;
if( n == "0" ){
zeroCount++;
}else{
if( zeroCount > 0 ){
ChineseStr += cnNums[0];
}
zeroCount = 0; //歸零
ChineseStr += cnNums[parseInt(n)]+cnIntRadice[m];
}
if( m==0 && zeroCount<4 ){
ChineseStr += cnIntUnits[q];
}
}
ChineseStr += cnIntLast;
//整型部分處理完畢
}
if( DecimalNum!= '' ){//小數部分
decLen = DecimalNum.length;
for( i=0; i<decLen; i++ ){
n = DecimalNum.substr(i,1);
if( n != '0' ){
ChineseStr += cnNums[Number(n)]+cnDecUnits[i];
}
}
}
if( ChineseStr == '' ){
//ChineseStr += cnNums[0]+cnIntLast+cnInteger;
ChineseStr += cnNums[0]+cnIntLast;
}/* else if( DecimalNum == '' ){
ChineseStr += cnInteger;
ChineseStr += cnInteger;
} */
return ChineseStr;
};
格式化金錢,三位加一個逗號
export const priceToThousands = (num: any) =>{
if(num)
{
num = toDecimal2(num)
//將num中的$,去掉,將num變成一個純粹的數據格式字符串
num = num.toString().replace(/\$|\,/g,'');
//如果num不是數字,則將num置0,並返回
if(''==num || isNaN(num)){return 'Not a Number ! ';}
//如果num是負數,則獲取她的符號
var sign = num.indexOf("-")> 0 ? '-' : '';
//如果存在小數點,則獲取數字的小數部分
var cents = num.indexOf(".")> 0 ? num.substr(num.indexOf(".")) : '';
cents = cents.length>1 ? cents : '' ;//注意:這里如果是使用change方法不斷的調用,小數是輸入不了的
//獲取數字的整數數部分
num = num.indexOf(".")>0 ? num.substring(0,(num.indexOf("."))) : num ;
//如果沒有小數點,整數部分不能以0開頭
if('' == cents){ if(num.length>1 && '0' == num.substr(0,1)){return 'Not a Number ! ';}}
//如果有小數點,且整數的部分的長度大於1,則整數部分不能以0開頭
else{if(num.length>1 && '0' == num.substr(0,1)){return 'Not a Number ! ';}}
//針對整數部分進行格式化處理,這是此方法的核心,也是稍難理解的一個地方,逆向的來思考或者采用簡單的事例來實現就容易多了
/*
也可以這樣想象,現在有一串數字字符串在你面前,如果讓你給他家千分位的逗號的話,你是怎么來思考和操作的?
字符串長度為0/1/2/3時都不用添加
字符串長度大於3的時候,從右往左數,有三位字符就加一個逗號,然后繼續往前數,直到不到往前數少於三位字符為止
*/
for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
{
num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
}
//將數據(符號、整數部分、小數部分)整體組合返回
return (sign + num + cents);
}
}
轉載於:https://my.oschina.net/wsxiao/blog/3034224