2021年8月22日 星期日

JavaScript 去除小數字串後面多餘的零

例如,"1.00200" => "1.002"

可以將小數字串轉型成數字,後面的零會自動去除。 
如果不想轉成數字,可以用正規表達式處理:

  1. \.0*$」:符合 ".0"、".00"、".000"....這類的字串尾,找出來,去除。
  2. (\.\d*[1-9])0+$」:符合".10"、".010"、".0100"、".100100000"....這類的字串尾,找出來,去除後面連續的"0",並將前面小數點「.」到最後一個不是「0」的部分,保留暫存為第一個變數「$1」。
  3. 用OR將兩者綜合起來:
    • 小數字串.replace(/\.0*$|(\.\d*[1-9])0+$/, '$1')
    • 第一個條件「\.0*$」,沒用「()」小括號紀錄符合的部分,所以沒有$1的值,效果猶如直接去除符合的部分。
      (如果這個條件也用了小括號儲存變數,連後面第二個條件的小括號,整個比對樣式共有兩個小括號,會變成第一個括號為$1,第二個括號為$2)
    • 第二個條件「(\.\d*[1-9])0+$」用「()」小括號將符合的字串範圍中,要保留的部分存成$1變數,整個符合範圍用$1取代。
/**
 * 去除小數字串後面多餘的零
 * @param {String} num_str
 * @returns {String}
 */
var removeFloatTrailingZero = function (num_str) {
   //new String("test"),typeof 是 object,所以多一個 instanceof 判斷
    if (typeof num_str === "string" || num_str instanceof String) {
        //字串
    } else {
       //避免隨意傳入非字串變數,導致後面replace()出錯
        num_str = String(num_str);//null、undefined 不能用 toString()
    }
    return num_str.replace(/\.0*$|(\.\d*[1-9])0+$/, '$1');
};

Regular Expression 取代效果:
https://regex101.com/r/l4FOO8/1/

測試字串:
0
0.0
0.00
1.0
10.00
100
200.010
200.01023000
200.100
200.1002
去除符合樣式,保留$1的最終結果:
0
0
0
1
10
100
200.01
200.01023
200.1
200.1002


其他:
若改成用「#$1」取代
數字字串.replace(/\.0*$|(\.\d*[1-9])0+$/, '#$1'),
可較清晰的觀察比對樣式條件OR、變數$1的取代邏輯。
https://regex101.com/r/Ng06RE/1
0
0#
0#
1#
10#
100
200#.01
200#.01023
200#.1
200.1002



沒有留言:

張貼留言