使用libphonenumber在不知道国家的情况下验证手机号码

时间:2016-10-05 15:42:41

标签: c# libphonenumber

我有来自任何国家/地区的电话号码列表(字符串)。

例如:

foreach (var item in items) { int countryCode = 0; var number = ""; if (item.StartsWith("+")) { countryCode = int.Parse(item.Substring(1, 2)); number = item.Substring(3); } else if (item.StartsWith("00")) { countryCode = int.Parse(item.Substring(2, 2)); number = item.Substring(4); } var regCode = phoneUtil.GetRegionCodeForCountryCode(countryCode); var numberWithRegCode = phoneUtil.Parse(number, regCode); if (!phoneUtil.IsValidNumber(numberWithRegCode)) continue; //else ... }

首先,我认为每个国家的代码长度恰好是两个数字,例如(33:法国,39:意大利,98:伊朗,......)。

使用 libphonenumber 库,您必须通过regCode进行解析。因为(在我的场景中)我得到字符串列表(手机号码),那么我必须是单独的国家代码和号码。

package main

import (
    "encoding/xml"
    "fmt"
)

type Member struct {
    Name  []Names `xml:"names"`
    Value string `xml:"value>string"`
}

type Names struct {
    Name  string `xml:"name"`
}

type Result struct {

    Members    []Member `xml:"params>param>value>array>data>value>struct>member"`
}

func main() {
    data := `
    <methodResponse>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value>
                            <string>12345abcde12345abcde12345</string>
                        </value>
                        <value>
                            <struct>
                                <member>
                                    <names>
                                     <name> 2 </name>
                                     <name> 3 </name>
                                     <name> 4 </name>
                                    </names>

                                    <value>
                                        <string>trex</string>
                                    </value>
                                </member>

                                <member>
                                    <names>
                                     <name> 2 </name>
                                     <name> 3 </name>
                                     <name> 4 </name>
                                    </names>

                                    <value>
                                        <string>trex</string>
                                    </value>
                                </member>
                           </struct>
                        </value>
                    </data>
                </array>
            </value>
        </param>
    </params>
</methodResponse>`

    v := Result{}
    err := xml.Unmarshal([]byte(data), &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    fmt.Println(v)
}

这段代码只适用于国家代码,它们的长度是两个数字!

但过了一会儿,我知道一些国家代码长度是一个数字(例如,美国:1),甚至是三个数字!。

现在,是否存在使用 libphonenumber 库(或其他解决方案)解决此问题的方法?

非常感谢

2 个答案:

答案 0 :(得分:3)

只要数字以+开头,libphonenumber库就可以自己查找国家/地区代码。因此,只需在数字的开头用加号替换双零。然后让图书馆自行决定该号码是否有效。

libphonenumber将自己知道哪个是加号后面的国家代码(它内部有一个所有代码的列表),然后根据正确的国家/地区应用规则来决定该数字是否有效。

bool IsValidNumber(string aNumber)
{
    bool result = false;

    aNumber = aNumber.Trim();

    if (aNumber.StartsWith("00"))
    {
        // Replace 00 at beginning with +
        aNumber = "+" + aNumber.Remove(0, 2);
    }

    try
    {
        result = PhoneNumberUtil.Instance.Parse(aNumber, "").IsValidNumber;
    }
    catch
    {
        // Exception means is no valid number
    }

    return result; 
}

答案 1 :(得分:-1)

您可以使用此软件包https://www.npmjs.com/package/dialcodes

的日期