首頁 > web前端 > js教程 > 在應用程式中儲存電話號碼的最佳方式

在應用程式中儲存電話號碼的最佳方式

Susan Sarandon
發布: 2024-12-29 17:49:13
原創
1002 人瀏覽過

Best way to store phone numbers in your app

在後端儲存電話號碼時,考慮效率、標準化、驗證和國際化至關重要。儲存電話號碼的最佳方式通常取決於應用程式的需求(例如國際支援、驗證規則、格式要求)。

選項 1:儲存完整的電話號碼和國家代碼

此方法以國際 E.164 格式(這是國際公認的電話號碼格式)儲存完整的電話號碼,包括國家/地區代碼。

為什麼選擇 E.164 格式?

  • 標準化:E.164 是全球公認的電話號碼格式,可確保唯一性。它包含國家/地區代碼並刪除所有格式字元(例如空格、連字號或括號),只留下數字。
  • 一致性:以 E.164 格式儲存電話號碼,可以避免不同使用者和系統之間的格式不一致。

  • 驗證:您可以使用 libphonenumber(Google 使用)等庫輕鬆驗證電話號碼,以驗證電話號碼格式正確且對於特定國家/地區有效。

E.164 格式範例:

  • 美國:18005555555
  • 英國:442079460958
  • 印度:919167988354

如何儲存:

資料庫架構:將電話號碼儲存為 E.164 格式的單一字串欄位。
欄位類型:String 或 VARCHAR(取決於資料庫)。
範例:VARCHAR(15)(E.164 最多允許 15 位數字)。

優點:

  • 國際化:支援全球所有號碼,讓您的系統輕鬆適應任何國家。
  • 簡化邏輯:由於電話號碼以統一格式存儲,因此您無需處理格式、驗證或國家/地區代碼提取的變化。
  • 無冗餘資料:您儲存一種規範格式,降低了冗餘或不一致資料的風險。

缺點:

  • 使用者體驗:使用者必須輸入完整的電話號碼和國家代碼,這可能不適用於所有用例(例如,僅輸入本地號碼)。
CREATE TABLE users (
  id INT PRIMARY KEY,
  phone_number VARCHAR(15) NOT NULL
);

登入後複製
登入後複製

選項 2:使用單獨的國家代碼儲存電話號碼

在此方法中,您將電話號碼分為兩個欄位:一個用於國家/地區代碼,另一個用於本地號碼。這為本地化格式提供了更大的靈活性,如果您的應用程式需要按區域劃分不同的電話號碼行為(例如驗證規則、格式顯示),這可能會更好。

CREATE TABLE users (
  id INT PRIMARY KEY,
  phone_number VARCHAR(15) NOT NULL
);

登入後複製
登入後複製

優點:

  • 本地化輸入。
  • 輕鬆格式化
  • 簡化的解析。

缺點:

  • 更複雜的邏輯:您可能需要額外的邏輯來分別管理國家/地區代碼和本地號碼,特別是在驗證或重建號碼以進行顯示時。
  • 潛在的冗餘:如果使用者頻繁更改國家代碼或電話號碼,您可能會遇到冗餘問題,尤其是在跨不同系統處理多個條目時。

最佳實務範例 (E.164):

以下是處理 E.164 格式的電話號碼和 libphonenumber 以在 Node.js 中進行驗證的完整範例:

  1. 安裝 libphonenumber
CREATE TABLE users (
  id INT PRIMARY KEY,
  country_code VARCHAR(5) NOT NULL,
  local_number VARCHAR(20) NOT NULL
);
登入後複製
  1. 範例程式碼(Node.js/Express)
npm install google-libphonenumber
登入後複製

從電話號碼中檢索國家/地區代碼

要使用此程式庫從電話號碼擷取國家/地區程式碼(例如 US 表示美國),您可以使用 getRegionCodeForNumber 函數。此函數接受一個電話號碼(必須使用 parseAndKeepRawInput 或類似方法進行解析)並傳回 ISO 3166-1 alpha-2 格式的國家代碼(例如 IN、US、GB 等)。

工作範例 -

const { PhoneNumberUtil, PhoneNumberFormat } = require('google-libphonenumber');
const phoneUtil = PhoneNumberUtil.getInstance();

const validatePhoneNumber = (phoneNumber, countryCode) => {
  try {
    const number = phoneUtil.parseAndKeepRawInput(phoneNumber, countryCode);
    const isValid = phoneUtil.isValidNumber(number);
    const formattedNumber = phoneUtil.format(number, PhoneNumberFormat.E164);

    return {
      isValid,
      formattedNumber
    };
  } catch (error) {
    return { isValid: false, error: 'Invalid phone number' };
  }
};

// Example usage
const { isValid, formattedNumber } = validatePhoneNumber('800-555-5555', 'US');
console.log(isValid, formattedNumber);  // true, +18005555555
登入後複製

解釋:

  • parseAndKeepRawInput(phoneNumber):
    此方法用於解析電話號碼並保留原始輸入,這意味著它可以處理各種格式的輸入(例如,帶有空格、破折號或括號)。

  • getRegionCodeForNumber(number):
    此函數傳回與解析的電話號碼關聯的國家代碼(ISO 3166-1 alpha-2 代碼,例如 IN、US、GB 等)。
    它透過將號碼與特定於國家/地區的電話號碼模式的內部清單進行匹配來實現此目的。

預期輸出

const { PhoneNumberUtil } = require('google-libphonenumber');
const phoneUtil = PhoneNumberUtil.getInstance();

// Function to get country code (ISO 3166-1 alpha-2)
const getCountryCodeFromPhoneNumber = (phoneNumber) => {
  try {
    // Parse the phone number and get the region (country code)
    const number = phoneUtil.parseAndKeepRawInput(phoneNumber);
    const countryCode = phoneUtil.getRegionCodeForNumber(number);
    return countryCode;
  } catch (error) {
    console.error("Error parsing phone number:", error);
    return null;
  }
};

// Test with different phone numbers
const testPhoneNumbers = [
  "+919167988354", // India
  "+14155552671",  // USA
  "+447777123456", // UK
  "+81 90 1234 5678", // Japan
];

testPhoneNumbers.forEach((phoneNumber) => {
  const countryCode = getCountryCodeFromPhoneNumber(phoneNumber);
  console.log(`Phone number: ${phoneNumber}, Country Code: ${countryCode}`);
});

登入後複製

重要考慮因素:

  • 電話號碼必須正確解析,並且應包含國家/地區代碼(後跟數字)。如果電話號碼是本地格式(不含國家代碼),則解析時需要指定預設地區(國家)。

  • 預設區域:如果電話號碼不包含國家/地區代碼,您可以使用parse 方法提供預設國家/地區代碼(例如,phoneUtil.parse(phoneNumber, 'IN' ) 代表印度)。

結論:

  • E.164 格式通常是在後端儲存電話號碼的最佳選擇,因為它已被普遍認可並簡化了驗證和儲存。
  • 單獨儲存國家/地區代碼和本地號碼在本地化系統中很有用,但會增加複雜性。
  • 使用 libphonenumber 等工具有效處理電話號碼驗證、格式化和解析。

以上是在應用程式中儲存電話號碼的最佳方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板