convertNumberToString

寫在前面

實踐準備

  • 首先我們依舊需要簡單梳理一下我們的實踐過程,再根據 ECMAScript-262 標準P61完善實踐

  • input: @params: { num } 輸入需要轉換的number, { radix } 轉換的指定基數

  • 對 input-num 的特殊處理

    • input-num 的特殊處理
  • 簡單算法處理

    • 獲取符號位
      • - 負 顯示
      • + 正 不顯示
    • 十進制
    • 二進制
    • 八進制
    • 十六進制
  • output: return resStr

實踐過程

  • 經過上面的分析,我們代碼可以先寫成

      function convertNumberToString(num) {
        try {
          const formatNum = Number(num) // 處理Number爲十進制
          if (isNaN(formatNum)) return 'NaN'
          if (isZero(formatNum)) return '0'
          const sign = getSign(formatNum)
          if (!isFinite(formatNum)) return sign + 'Infinity'
          return convertDecimalNumberToString(formatNum)
        } catch (err) {
          throw new Error(err)
        }
      }
    
  • input number 的特殊處理

    • If m is NaN, return the String “NaN”.

      if (isNaN(formatNum)) return ‘NaN’

    • If m is +0 or -0, return the String “0”.

        if (isZero(formatNum)) return '0'
        function isZero(num) {
          if (1 / num === Infinity || 1 / num === -Infinity) {
            return true
          }
          return false
        }
      
    • If m is less than zero, return the string-concatenation of “-” and ! NumberToString(-m).

        const sign = getSign(formatNum)
        function getSign(num) {
          if (num === -Infinity) {
            return "-"
          } else if (num === Infinity) {
            return ""
          } // 特殊情況 0 前面已經處理
          return num / Math.abs(num) === 1 ? "" : "-"
        }
      
    • If m is +∞, return the String “Infinity”.

      if (!isFinite(formatNum)) return sign + ‘Infinity’

  • 常規 Decimal Number 處理

      function convertDecimalNumberToString(num) {
        const radix = 10
        let int = Math.floor(num)
        let float = (num - int) * 100 / 100
        let resInt = ''
        let resFloat = ''
        // 整數部分 取餘,除以基數
        while (int > 0) {
          resInt = String(int % radix) + resInt
          int = Math.floor(int / radix)
        }
        if (float) {
          resFloat = '.'
          // 小數部分,乘以基數,取整
          while (float > 0) {
            resFloat = resFloat + Math.floor(float * radix)
            float -= Math.floor(float * radix)
          }
        }
        return resInt + resFloat
      }
    

測試用例

  console.log(convertNumberToString(-Infinity))
  console.log('toString', -Infinity.toString())
  console.log(convertNumberToString(+Infinity))
  console.log('toString', +Infinity.toString())
  console.log(convertNumberToString(120.11112))
  console.log('toString', 120.11112.toString())
  console.log(convertNumberToString(120))
  console.log('toString', (120).toString())
  • 測試截圖
    • 測試截圖

寫在後面

  • 可以看出,我們寫的 converNumbertoString 遇到浮點數,就失靈了,有想到說 用 toString,然後正則匹配出小數點後面的浮點數,舍入相應位數,但是這樣,就用到了 toString 方法,似乎與我的最初想法實現 convertNumbertToString 死鎖了 🙃
  • 大家有其他的不用 toString 實踐,歡迎評論告訴我呀~
  • 代碼地址
  • 祝大家多多發財
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章