我见过Google图书馆libphonenumber,我正在考虑使用它来格式化国际网站上用户输入的电话号码。最终结果需要保持一致,因为内部CRM与电话系统集成在一起,以便在客户打电话时提取正确的用户帐户详细信息。电话系统将始终包含该用户的国际代码,即使该呼叫来自与办公室相同的国家/地区内。
因此,我打算提供一个带有国际拨号代码的下拉菜单,然后将其余的电话字段保留为自由格式,但仅限于数字,空格,括号和短划线。然后通过删除除数字之外的所有内容来清理条目。
libphonenumber会进行初步的健全性检查以确定它是否是有效数字,然后将其转换为正确的国际格式。
我认为分别区域代码和用户号码分开会有点过分,但我的问题是,是仅存储最终的完全国际格式化条目,还是将国际代码分别存储到其余数字(例如2分贝字段) 。这样做有合理的技术原因,还是仅仅是商业决策?
答案 0 :(得分:2)
...我的问题是,是仅存储最终的完全国际格式化条目,还是将国际代码分别存储到其余数字(例如2个数据库字段)。这样做有合理的技术原因,还是仅仅是商业决策?
每次在数据库行中创建字段时,都需要有商业原因来存储该信息。
在您的示例中,分别存储国际拨号代码可以确定您从不同国家/地区拨打的客户数量(对国际拨号代码进行分组和汇总)。此外,在同一国家/地区内拨打电话时,您不需要国际拨号代码。因此,在大多数情况下,在没有国际拨号代码的情况下显示电话号码可能会让用户感到困惑。
对于大多数企业而言,将国际电话号码分解为不同的领域可能会非常困难。但是,如果您有这样做的商业原因,您可以将大多数电话号码分解为区域,区域和地区段。 (我不熟悉所有国际电话号码格式,因此您可能需要额外的细分。)
答案 1 :(得分:0)
在数据库中存储两个字段:
- 两位数的国家/地区代码(字符串)
- 电话号码的国内部分(字符串)
醇>
使用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
...这足以分别显示给本地用户,进行国际拨号和编程使用(例如,短信)。