js如何实现代码优化(游戏金币数字太长而转换用单位代替)

新手上路,请多包涵

function moneyToStr(val) {

            if (typeof val != 'number') {
                console.error('不是数字');
                return
            }
            
            let str1 = val.toLocaleString() + '';
            str = str1.replace(/,/g, "");
            let strLength = str.length;

            if (strLength <= 3) {
                return str;
            } else if (strLength >= 4 && strLength <= 6) {

                return str.substring(0, strLength - 3) + '.' + str.substring(strLength - 3, strLength - 1) + 'K';
            } else if (strLength >= 7 && strLength <= 9) {

                return str.substring(0, strLength - 6) + '.' + str.substring(strLength - 6, strLength - 4) + 'M';
            } else if (strLength >= 10 && strLength <= 12) {

                return str.substring(0, strLength - 9) + '.' + str.substring(strLength - 9, strLength - 7) + 'G';
            } else if (strLength >= 13 && strLength <= 15) {

                return str.substring(0, strLength - 12) + '.' + str.substring(strLength - 12, strLength - 10) + 'T';
            } else if (strLength >= 16 && strLength <= 18) {

                return str.substring(0, strLength - 15) + '.' + str.substring(strLength - 15, strLength - 13) + 'P';
            } else if (strLength >= 19 && strLength <= 21) {

                return str.substring(0, strLength - 18) + '.' + str.substring(strLength - 18, strLength - 16) + 'E';
            } else if (strLength >= 22 && strLength <= 24) {

                return str.substring(0, strLength - 21) + '.' + str.substring(strLength - 21, strLength - 19) + 'Z';
            } else if (strLength >= 25 && strLength <= 27) {

                return str.substring(0, strLength - 24) + '.' + str.substring(strLength - 24, strLength - 22) + 'Y';
            } else if (strLength >= 28 && strLength <= 30) {

                return str.substring(0, strLength - 27) + '.' + str.substring(strLength - 27, strLength - 25) + 'S';
            } else if (strLength >= 31 && strLength <= 33) {

                return str.substring(0, strLength - 30) + '.' + str.substring(strLength - 30, strLength - 28) + 'O';
            } else if (strLength >= 34 && strLength <= 36) {

                return str.substring(0, strLength - 33) + '.' + str.substring(strLength - 33, strLength - 31) + 'N';
            } else if (strLength >= 37 && strLength <= 39) {

                return str.substring(0, strLength - 36) + '.' + str.substring(strLength - 36, strLength - 34) + 'H';
            } else if (strLength >= 40 && strLength <= 42) {

                return str.substring(0, strLength - 39) + '.' + str.substring(strLength - 39, strLength - 37) + 'X';
            }
            if (strLength > 42) {
                return 999 + 'max';
            }
        }

代码如上所示,虽然可以返回正确结果,可是这样看起来不太优雅,请问有没有大神有优化建议

阅读 2.5k
2 个回答
const units = ['K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'S', 'O', 'N', 'H', 'X']; 
if (strLength <= 3) {
                return str;
} else if (strLength > 42) {
    return 999 + 'max';
} else {
  const unitIndex = Math.ceil(strLength / 3) - 2
  const unit = units[unitIndex]
  const leftLength = strLength - (3 * (Math.ceil(strLength / 3) - 1))
  return str.substring(0, leftLength) + '.' + str.substring(leftLength, leftLength + 2) + unit
}             

首先找规律,没有规律你这里就只能把那几个条件的数字和单位放到一个数组里遍历了,一个if和这个if里的返回是一个对象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏