寫在前面
- 是的我要折騰一下 Javascript convertNumberToString 了🙆
- convertStringToNumber 實現
實踐準備
-
首先我們依舊需要簡單梳理一下我們的實踐過程,再根據 ECMAScript-262 標準P61完善實踐
-
input: @params: { num } 輸入需要轉換的number, { radix } 轉換的指定基數
-
對 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 實踐,歡迎評論告訴我呀~
- 代碼地址
- 祝大家多多發財