Comparing version 0.0.17 to 0.0.18
@@ -19,25 +19,20 @@ | ||
m.push(tt); | ||
m.push(tt.div(100)); | ||
let ccc = new CNYCurrency(); | ||
let y = new CNYCurrency(null); | ||
m.push(ccc); | ||
m.push(new CNYCurrency(123456789.00)); | ||
m.push(new CNYCurrency(12000.12)); | ||
m.push(new CNYCurrency(10000020.10)); | ||
m.push(new CNYCurrency(10020.01)); | ||
m.push(new CNYCurrency(12000.01)); | ||
m.push(new CNYCurrency(1409.50)); | ||
m.push(new CNYCurrency(19.50)); | ||
m.push(new CNYCurrency(6007.14)); | ||
m.push(new CNYCurrency(16409.02)); | ||
m.push(new CNYCurrency(325.04)); | ||
for(let mm of m) { | ||
console.log(mm.value, mm.intValue, mm.toString(), mm.format(true, true), mm.Chinese()); | ||
let c2 = mm.Chinese(); | ||
console.log(mm.isErr,mm.value, mm.format(true, true), c2, mm.errMsg); | ||
} | ||
for(let i = 0; i < 100000000; i++) { | ||
ccc.intValue = i; | ||
let y = ccc.yuan; | ||
let c = ccc.cent; | ||
let s = y.toString() + '.' + c.toString().padStart(2, '0'); | ||
if (i % 1000 === 0) { | ||
console.log(i); | ||
} | ||
if(s !== ccc.toString()) { | ||
console.log(console.log(ccc.toString(), s, ccc.yuan, ccc.cent)); | ||
} | ||
} | ||
console.log('finish'); |
@@ -1,2 +0,2 @@ | ||
const _ = require("lodash"); | ||
/** 货币精度 */ | ||
@@ -14,2 +14,25 @@ const Precision = 100; | ||
/** | ||
* 将值转换为数字, | ||
* - 仅限cnycurrency这个文件专用,外部请不要使用 | ||
* @param {number | string} paramValue 值 | ||
* @return {{result: boolean, value: number}} 转换后的值 | ||
* - result === true 表示转换有效 | ||
* - result === false 表示转换失败 | ||
*/ | ||
function __toNumber(paramValue) { | ||
let r = { | ||
result: false, | ||
value: 0 | ||
} | ||
if(_.isNumber(paramValue)) { | ||
r.value = paramValue; | ||
} | ||
else { | ||
r.value = Number.parseFloat(paramValue); | ||
} | ||
r.result = !Number.isNaN(r.value); | ||
return r; | ||
} | ||
/** | ||
* 解析货币,只保留两位小数 | ||
@@ -217,10 +240,15 @@ * 要求值的范围在[90071992547409.91,-90071992547409.91],超过该值,则视为出错 | ||
* 乘一个值 | ||
* @param {number | string | CNYCurrency} paramNumber 值 | ||
* @param {number | string} paramNumber 值 | ||
* @return {CNYCurrency} 返回计算后的Currency对象 | ||
*/ | ||
mul(paramNumber) { | ||
let r = new CNYCurrency(paramNumber); | ||
if(!r.isErr && !this.isErr) { | ||
r.m_IntValue = Math.round(this.value * r.value * Precision); | ||
let r = new CNYCurrency(); | ||
let v = __toNumber(paramNumber); | ||
if(v.result) { | ||
r.assign(this.value * v.value); | ||
} | ||
else { | ||
r.m_errMsg = `${paramNumber} is invalid number`; | ||
r.m_ErrFlag = true; | ||
} | ||
return r; | ||
@@ -230,28 +258,43 @@ } | ||
* 自乘一个值 | ||
* @param {number | string | CNYCurrency} paramNumber 值 | ||
* @return {CNYCurrency} 返回计算后的Currency对象 | ||
* @param {number | string} paramNumber 值 | ||
* @return {boolean} 计算结果 | ||
* - true 表示计算成功 | ||
* - false 表示计算失败 | ||
*/ | ||
selfMul(paramNumber) { | ||
let r = new CNYCurrency(paramNumber); | ||
if(!r.isErr && !this.isErr) { | ||
this.m_IntValue = Math.round(this.value * r.value * Precision); | ||
let v = __toNumber(paramNumber); | ||
if(!v.result) { | ||
return false; | ||
} | ||
return this; | ||
let r = new CNYCurrency(v.value * this.value); | ||
if(r.isErr) { | ||
return false; | ||
} | ||
else { | ||
this.assign(r); | ||
return true; | ||
} | ||
} | ||
/** | ||
* 除以一个值 | ||
* @param {number | string | CNYCurrency} paramNumber 值 | ||
* @param {number | string} paramNumber 值 | ||
* @return {CNYCurrency} 返回计算后的Currency对象 | ||
*/ | ||
div(paramNumber) { | ||
let r = new CNYCurrency(paramNumber); | ||
if(!r.isErr && !this.isErr) { | ||
if(r.m_IntValue === 0) { | ||
let r = new CNYCurrency(); | ||
let v = __toNumber(paramNumber); | ||
if(v.result) { | ||
if(v.value === 0) { | ||
r.m_errMsg = `${paramNumber} is zero!;`; | ||
r.m_ErrFlag = true; | ||
r.m_ErrMsg = `${paramNumber} => ${r.value} is zero!`; | ||
} else { | ||
r.assign(this.value / v.value); | ||
} | ||
else { | ||
r.m_IntValue = Math.round(this.value / r.value * Precision); | ||
} | ||
} | ||
else { | ||
r.m_errMsg = `${paramNumber} is invalid number.`; | ||
r.m_ErrFlag = true; | ||
} | ||
return r; | ||
@@ -261,17 +304,23 @@ } | ||
* 自除以一个值 | ||
* @param {number | string | CNYCurrency} paramNumber 值 | ||
* @return {CNYCurrency} 返回计算后的Currency对象 | ||
* @param {number | string} paramNumber 值 | ||
* @return {boolean} 计算结果 | ||
* - true 表示计算成功 | ||
* - false 表示计算失败 | ||
*/ | ||
selfDiv(paramNumber) { | ||
let r = new CNYCurrency(paramNumber); | ||
if(!r.isErr && !this.isErr) { | ||
if(r.m_IntValue === 0) { | ||
r.m_ErrFlag = true; | ||
r.m_ErrMsg = `${paramNumber} => ${r.value} is zero!`; | ||
} | ||
else { | ||
this.m_IntValue = Math.round(this.value / r.value * Precision); | ||
} | ||
let v = __toNumber(paramNumber); | ||
if(!v.result) { | ||
return false; | ||
} | ||
return this; | ||
if(v.value === 0) { | ||
return false; | ||
} | ||
let r = new CNYCurrency(this.value / v.value); | ||
if(r.isErr) { | ||
return false; | ||
} | ||
else { | ||
this.assign(r); | ||
return true; | ||
} | ||
} | ||
@@ -297,28 +346,103 @@ /** | ||
} | ||
/** | ||
* 生成中文大写数字 | ||
* - 引用来源:https://www.jb51.net/article/89661.htm | ||
* - 增加在元后,角为0的情况增加0,如0.01为零元零角 | ||
* @param {string} paramNegative 如果是负数时,前面的前缀 | ||
* @return {string} 中文大写结果 | ||
*/ | ||
Chinese() { | ||
Chinese(paramNegative = '负') { | ||
//汉字的数字 | ||
let cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] | ||
//基本单位 | ||
let cnIntRadice =['', '拾', '佰', '仟']; | ||
//对应整数部分扩展单位 | ||
let cnIntUnits = ['', '万', '亿', '兆']; | ||
//对应小数部分单位 | ||
let cnDecUnits = ['角', '分', '毫', '厘']; | ||
//整数金额时后面跟的字符 | ||
let cnInteger = '整'; | ||
//整型完以后的单位 | ||
let cnIntLast = '元'; | ||
//最大处理的数字 | ||
let maxNum = 999999999999999.9999; | ||
//金额整数部分 | ||
let integerNum; | ||
//金额小数部分 | ||
let decimalNum; | ||
//输出的中文金额字符串 | ||
let chineseStr = ''; | ||
//分离金额后用的数组,预定义 | ||
let parts; | ||
let negative = ''; | ||
if(this.intValue < 0) { | ||
negative = '负'; | ||
negative = paramNegative;// '负'; | ||
} | ||
let n = Math.abs(this.value).toFixed(2);; | ||
let unit = "仟佰拾京仟佰拾兆仟佰拾亿仟佰拾万仟佰拾元角分"; | ||
let str = ""; | ||
n += "00"; | ||
let p = n.indexOf('.'); | ||
if (p >= 0) { | ||
n = n.substring(0, p) + n.substr(p+1, 2); | ||
let money = Math.abs(this.value); | ||
if (money >= maxNum) { | ||
//超出最大处理数字 | ||
return negative + ''; | ||
} | ||
if (money == 0) { | ||
chineseStr = negative + cnNums[0] + cnIntLast + cnInteger; | ||
return chineseStr; | ||
} | ||
//转换为字符串 | ||
money = money.toString(); | ||
if (money.indexOf('.') == -1) { | ||
integerNum = money; | ||
decimalNum = ''; | ||
} else { | ||
parts = money.split('.'); | ||
integerNum = parts[0]; | ||
decimalNum = parts[1].substr(0, 4); | ||
} | ||
//获取整型部分转换 | ||
if (parseInt(integerNum, 10) > 0) { | ||
let zeroCount = 0; | ||
let IntLen = integerNum.length; | ||
for (let i = 0; i < IntLen; i++) { | ||
let n = integerNum.substr(i, 1); | ||
let p = IntLen - i - 1; | ||
let q = p / 4; | ||
let 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 != '') { | ||
let decLen = decimalNum.length; | ||
for (let i = 0; i < decLen; i++) { | ||
let n = decimalNum.substr(i, 1); | ||
if (n != '0') { | ||
chineseStr += cnNums[Number(n)] + cnDecUnits[i]; | ||
} | ||
else { | ||
if (i === 0) { | ||
chineseStr += cnNums[0]; | ||
} | ||
unit = unit.substr(unit.length - n.length); | ||
for (var i=0; i < n.length; i++) { | ||
str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i); | ||
} | ||
} | ||
} | ||
return negative + str.replace(/零(仟|百|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万|壹(拾)/g, "$1$2").replace(/^元零?|零分/g, "").replace(/元$/g, "元整"); | ||
if (chineseStr == '') { | ||
chineseStr += cnNums[0] + cnIntLast + cnInteger; | ||
} else if (decimalNum == '') { | ||
chineseStr += cnInteger; | ||
} | ||
return negative + chineseStr; | ||
} | ||
@@ -325,0 +449,0 @@ /** |
{ | ||
"name": "xmcommon", | ||
"version": "0.0.17", | ||
"version": "0.0.18", | ||
"description": "javascript common lib for es6", | ||
@@ -27,3 +27,3 @@ "main": "index.js", | ||
"dependencies": { | ||
"@types/node": "^10.14.4", | ||
"@types/node": "^10.14.10", | ||
"lodash": "^4.17.11" | ||
@@ -30,0 +30,0 @@ }, |
@@ -34,2 +34,9 @@ # xmcommon | ||
## 0.0.18 | ||
- 2019-06-26 | ||
- \* 原生成中文货币大写存在问题,重新找了一个新的版本替换 来源:https://www.jb51.net/article/89661.htm | ||
- \+ 增加多情况货币测试 | ||
- \* 修复乘除的bug, 对于自乘与自除,返回的是boolean,判断成功失败 | ||
## 0.0.17 | ||
@@ -36,0 +43,0 @@ |
@@ -1092,10 +1092,12 @@ // Type definitions for xmcommon 0.0 | ||
*/ | ||
public mul(paramNumber: number | string | CNYCurrency | null | undefined): CNYCurrency; | ||
public mul(paramNumber: number | string): CNYCurrency; | ||
/** | ||
* 自乘一个值 | ||
* @param paramNumber 值 | ||
* @return {boolean} 计算结果 | ||
* - true 表示计算成功 | ||
* - false 表示计算失败 | ||
*/ | ||
public selfMul(paramNumber: number | string): boolean; | ||
/** | ||
* 自乘一个值 | ||
* @param paramNumber 值 | ||
* @return 返回计算后的Currency对象 | ||
*/ | ||
public selfMul(paramNumber: number | string | CNYCurrency | null | undefined): CNYCurrency; | ||
/** | ||
* 除以一个值 | ||
@@ -1105,10 +1107,12 @@ * @param paramNumber 值 | ||
*/ | ||
public div(paramNumber: number | string | CNYCurrency | null | undefined): CNYCurrency; | ||
public div(paramNumber: number | string): CNYCurrency; | ||
/** | ||
* 自除以一个值 | ||
* @param {number | string} paramNumber 值 | ||
* @return {boolean} 计算结果 | ||
* - true 表示计算成功 | ||
* - false 表示计算失败 | ||
*/ | ||
public selfDiv(paramNumber: number | string): CNYCurrency; | ||
/** | ||
* 自除以一个值 | ||
* @param paramNumber 值 | ||
* @return 返回计算后的Currency对象 | ||
*/ | ||
public selfDiv(paramNumber: number | string | CNYCurrency | null | undefined): CNYCurrency; | ||
/** | ||
* 货币的整数部分 | ||
@@ -1122,6 +1126,9 @@ * @return 返回整数 | ||
public readonly cent: number; | ||
/** | ||
* 生成中文大写数字 | ||
* @return 中文大写结果 | ||
*/ | ||
/** | ||
* 生成中文大写数字 | ||
* - 引用来源:https://www.jb51.net/article/89661.htm | ||
* - 增加在元后,角为0的情况增加0,如0.01为零元零角 | ||
* @param {string} paramNegative 如果是负数时,前面的前缀 | ||
* @return {string} 中文大写结果 | ||
*/ | ||
public Chinese(): string; | ||
@@ -1128,0 +1135,0 @@ /** |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
128446
3788
184
Updated@types/node@^10.14.10