1

我看过谷歌图书馆的 libphonenumber,我正在考虑用它来格式化用户在国际网站上输入的电话号码。最终结果需要保持一致,因为内部 CRM 与电话系统集成,以便在客户打电话时提取正确的用户帐户详细信息。电话系统将始终包含该用户的国际代码,即使呼叫来自与办公室相同的国家/地区。

因此,我打算提供一个带有国际拨号代码的下拉列表,然后将电话字段的其余部分保留为自由格式,但仅限于数字、空格、括号和破折号。然后将通过删除除数字之外的所有内容来清理条目。

libphonenumber 将进行初始健全性检查以确定它是否看起来是一个有效的数字,然后将其转换为正确的国际格式。

我认为将区号和用户号码分开分开会有点过分,但我的问题是是否只存储最终的完全国际格式的条目,或者将国际代码分别存储到号码的其余部分(例如 2 db 字段)。这样做有正当的技术原因,还是纯粹的商业决策?

4

2 回答 2

2

...我的问题是是否只存储最终的完全国际格式的条目,或者将国际代码单独存储到数字的其余部分(例如 2 db 字段)。这样做有正当的技术原因,还是纯粹的商业决策?

每当您在数据库行中创建字段时,都需要出于业务原因来存储该信息。

在您的示例中,单独存储国际拨号代码可以确定您从不同国家/地区呼叫的客户数量(对国际拨号代码进行分组和求和)。此外,在同一国家/地区拨打电话时,您不需要国际拨号代码。因此,在大多数情况下,显示没有国际拨号代码的电话号码可能不会让用户感到困惑。

对于大多数企业来说,将国际电话号码分成不同的字段是很困难的,而且可能是矫枉过正。但是,如果您有这样做的商业原因,您可以将大多数电话号码分解为区域、区域和地区段。(我不熟悉所有国际电话号码格式,因此您可能需要添加其他部分。)

于 2012-11-13T18:30:28.590 回答
0

在您的数据库中存储两个字段:

  1. 两位数国家代码(字符串)
  2. 电话号码的国家部分(字符串)

使用libphonenumber,您可以解析数字以生成您可能希望在数据库之外使用的不同格式。

例如:

| countryCode | nationalNumber
--------------------------------
| US          | 800-flowers

可以按如下方式使用(假设这个Javascript lib):

// Google's libphonenumber library
import libphonenumber from 'google-libphonenumber';

// Grab the parts of the lib we'll need
const phoneUtil = libphonenumber.PhoneNumberUtil.getInstance();
const phoneFormat = libphonenumber.PhoneNumberFormat;

// Parse the number -- assume we already got this from the DB
let parsed;

try {
  parsed = phoneUtil.parse(db.nationalNumber, db.countryCode);
} catch(e) {
   throw new Error("Couldn't parse the phone number");
}

// Now print a few examples
console.log(phoneUtil.format(parsed, phoneFormat.NATIONAL));
console.log(phoneUtil.format(parsed, phoneFormat.INTERNATIONAL));
console.log(phoneUtil.format(parsed, phoneFormat.E164));

将输出:

(800) 356-9377

+1 800-356-9377

+18003569377

...这足以分别显示给本地用户、国际拨号和编程使用(例如 SMS 消息传递)。

于 2016-05-06T10:03:21.937 回答