跳至內容
Astera Technology

把主號碼數字與分機分開保存

按格式移除空格,保留分機前置零及原主號碼。

下載完整個案資料及參考答案 ↓

來源格式與預期記錄

這是原創假設轉換例子。輸入限下列欄位的普通、無循環 JSON 形記錄,統一記錄格式及拒絕代碼由本例訂明。若換來源,先修改格式約定。

本例假設格式用加號後 1 至 4 位數字作前綴,主號碼可含數字及半形空格,分機可省略或填數字字串。只移除主號碼空格;分機 007 仍是文字,沒提供則 null。+000 是解析用假前綴,不表示可撥通。

可修改的假設轉換個案
個案輸入記錄(JSON)預期輸出(JSON)
分機與主號分開{"countryPrefix":"+000","subscriber":"1234 5678","extension":"007"}{"ok":true,"value":{"countryPrefix":"+000","subscriberDigits":"12345678","extension":"007","sourceSubscriber":"1234 5678"}}
拒絕分機非數字{"countryPrefix":"+000","subscriber":"1234","extension":"x"}{"ok":false,"error":"EXTENSION_FORMAT"}
保留沒有分機{"countryPrefix":"+000","subscriber":"1234"}{"ok":true,"value":{"countryPrefix":"+000","subscriberDigits":"1234","extension":null,"sourceSubscriber":"1234"}}
下載可編輯 CSV ↓

在本機執行轉換

把完整例子以 JavaScript 模組在 Node.js 執行,內含純轉換函數、三個輸入及寫明的預期輸出,對不上便由斷言停止。拒絕個案回傳 ok=false 及代碼,不回傳半份統一記錄。

完整函數及可執行個案
import assert from 'node:assert/strict';

function phoneExtension(i){
  const fail=error=>({ok:false,error});if(!i||typeof i.countryPrefix!=='string'||!/^\+\d{1,4}$/.test(i.countryPrefix)||typeof i.subscriber!=='string'||!/^[0-9 ]+$/.test(i.subscriber))return fail('PHONE_PART');
  const subscriberDigits=i.subscriber.replace(/ /g,'');if(!subscriberDigits)return fail('PHONE_PART');
  if(i.extension!==undefined&&(typeof i.extension!=='string'||!/^\d+$/.test(i.extension)))return fail('EXTENSION_FORMAT');
  return {ok:true,value:{countryPrefix:i.countryPrefix,subscriberDigits,extension:i.extension??null,sourceSubscriber:i.subscriber}};
}

// Original synthetic cases; expected outputs are literal records.
const cases = [
  {
    "label": "Keep extension separate",
    "input": {
      "countryPrefix": "+000",
      "subscriber": "1234 5678",
      "extension": "007"
    },
    "expected": {
      "ok": true,
      "value": {
        "countryPrefix": "+000",
        "subscriberDigits": "12345678",
        "extension": "007",
        "sourceSubscriber": "1234 5678"
      }
    }
  },
  {
    "label": "Reject non-digit extension",
    "input": {
      "countryPrefix": "+000",
      "subscriber": "1234",
      "extension": "x"
    },
    "expected": {
      "ok": false,
      "error": "EXTENSION_FORMAT"
    }
  },
  {
    "label": "Preserve no extension",
    "input": {
      "countryPrefix": "+000",
      "subscriber": "1234"
    },
    "expected": {
      "ok": true,
      "value": {
        "countryPrefix": "+000",
        "subscriberDigits": "1234",
        "extension": null,
        "sourceSubscriber": "1234"
      }
    }
  }
];
for (const sample of cases) {
  const actual = phoneExtension(sample.input);
  assert.deepEqual(actual, sample.expected);
  console.log(sample.label, JSON.stringify(actual));
}
下載可執行例子 ↓

判清邊界個案

007 應接在 12345678 後,還是改成 7?

查看參考答案

兩者都不用。subscriberDigits 為 "12345678",extension 為 "007"。原主號碼 "1234 5678" 另存,分機是獨立資料。

相關資源