Digit and ZhDigit convertion each other

Run Settings
LanguageJavaScript
Language Version
Run Command
var dio = require('./dio.js') /** * https://segmentfault.com/a/1190000008962568 * a little trouble needs to be fixed **/ console.log(dio); var digit = 134692035678; var zh_digit = dio.toZhDigit(digit); console.log(zh_digit) var digit = dio.zhDigitToArabic(zh_digit); console.log(digit)
/** * 阿拉伯数字转中文数字, * 如果传入数字时则最多处理到21位,超过21位js会自动将数字表示成科学计数法,导致精度丢失和处理出错 * 传入数字字符串则没有限制 * @param {number|string} digit */ function toZhDigit(digit) { digit = typeof digit === 'number' ? String(digit) : digit; const zh = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']; const unit = ['千', '百', '十', '']; const quot = ['万', '亿', '兆', '京', '垓', '秭', '穰', '沟', '涧', '正', '载', '极', '恒河沙', '阿僧祗', '那由他', '不可思议', '无量', '大数']; let breakLen = Math.ceil(digit.length / 4); let notBreakSegment = digit.length % 4 || 4; let segment; let zeroFlag = [], allZeroFlag = []; let result = ''; while (breakLen > 0) { if (!result) { // 第一次执行 segment = digit.slice(0, notBreakSegment); let segmentLen = segment.length; for (let i = 0; i < segmentLen; i++) { if (segment[i] != 0) { if (zeroFlag.length > 0) { result += '零' + zh[segment[i]] + unit[4 - segmentLen + i]; // 判断是否需要加上 quot 单位 if (i === segmentLen - 1 && breakLen > 1) { result += quot[breakLen - 2]; } zeroFlag.length = 0; } else { result += zh[segment[i]] + unit[4 - segmentLen + i]; if (i === segmentLen - 1 && breakLen > 1) { result += quot[breakLen - 2]; } } } else { // 处理为 0 的情形 if (segmentLen == 1) { result += zh[segment[i]]; break; } zeroFlag.push(segment[i]); continue; } } } else { segment = digit.slice(notBreakSegment, notBreakSegment + 4); notBreakSegment += 4; for (let j = 0; j < segment.length; j++) { if (segment[j] != 0) { if (zeroFlag.length > 0) { // 第一次执行zeroFlag长度不为0,说明上一个分区最后有0待处理 if (j === 0) { result += quot[breakLen - 1] + zh[segment[j]] + unit[j]; } else { result += '零' + zh[segment[j]] + unit[j]; } zeroFlag.length = 0; } else { result += zh[segment[j]] + unit[j]; } // 判断是否需要加上 quot 单位 if (j === segment.length - 1 && breakLen > 1) { result += quot[breakLen - 2]; } } else { // 第一次执行如果zeroFlag长度不为0, 且上一划分不全为0 if (j === 0 && zeroFlag.length > 0 && allZeroFlag.length === 0) { result += quot[breakLen - 1]; zeroFlag.length = 0; zeroFlag.push(segment[j]); } else if (allZeroFlag.length > 0) { // 执行到最后 if (breakLen == 1) { result += ''; } else { zeroFlag.length = 0; } } else { zeroFlag.push(segment[j]); } if (j === segment.length - 1 && zeroFlag.length === 4 && breakLen !== 1) { // 如果执行到末尾 if (breakLen === 1) { allZeroFlag.length = 0; zeroFlag.length = 0; result += quot[breakLen - 1]; } else { allZeroFlag.push(segment[j]); } } continue; } } --breakLen; } } return result; } /****************************************************** * 分隔线 * ****************************************************/ function zhDigitToArabic(digit) { const zh = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']; const unit = ['千', '百', '十']; const quot = ['万', '亿', '兆', '京', '垓', '秭', '穰', '沟', '涧', '正', '载', '极', '恒河沙', '阿僧祗', '那由他', '不可思议', '无量', '大数']; let result = 0, quotFlag; for (let i = digit.length - 1; i >= 0; i--) { if (zh.indexOf(digit[i]) > -1) { // 数字 if (quotFlag) { result += quotFlag * getNumber(digit[i]); } else { result += getNumber(digit[i]); } } else if (unit.indexOf(digit[i]) > -1) { // 十分位 if (quotFlag) { result += quotFlag * getUnit(digit[i]) * getNumber(digit[i - 1]); } else { result += getUnit(digit[i]) * getNumber(digit[i - 1]); } --i; } else if (quot.indexOf(digit[i]) > -1) { // 万分位 if (unit.indexOf(digit[i - 1]) > -1) { if (getNumber(digit[i - 1])) { result += getQuot(digit[i]) * getNumber(digit[i - 1]); } else { result += getQuot(digit[i]) * getUnit(digit[i - 1]) * getNumber(digit[i - 2]); quotFlag = getQuot(digit[i]); --i; } } else { result += getQuot(digit[i]) * getNumber(digit[i - 1]); quotFlag = getQuot(digit[i]); } --i; } } return result; // 返回中文大写数字对应的阿拉伯数字 function getNumber(num) { for (let i = 0; i < zh.length; i++) { if (zh[i] == num) { return i; } } } // 取单位 function getUnit(num) { for (let i = unit.length; i > 0; i--) { if (num == unit[i - 1]) { return Math.pow(10, 4 - i); } } } // 取分段 function getQuot(q) { for (var i = 0; i < quot.length; i++) { if (q == quot[i]) { return Math.pow(10, (i + 1) * 4); } } } } module.exports = { toZhDigit:toZhDigit, zhDigitToArabic:zhDigitToArabic }
Editor Settings
Theme
Key bindings
Full width
Lines