init: 1.0.0

This commit is contained in:
Chang lue Tsen
2025-04-25 12:08:29 +09:00
commit 8addcc584b
1031 changed files with 76472 additions and 0 deletions
+113
View File
@@ -0,0 +1,113 @@
package phone
import (
"fmt"
"regexp"
"github.com/nyaruka/phonenumbers"
)
func Check(areaCode, telephone string) bool {
parsedNumber, err := phonenumbers.Parse(fmt.Sprintf("+%s%s", areaCode, telephone), areaCode)
if err != nil {
return false
}
// 检查手机号是否有效
return phonenumbers.IsValidNumber(parsedNumber)
}
func CheckPhone(telephone string) bool {
parsedNumber, err := phonenumbers.Parse(fmt.Sprintf("+%s", telephone), "")
if err != nil {
return false
}
// 检查手机号是否有效
return phonenumbers.IsValidNumber(parsedNumber)
}
func GetCountryCode(telephone string) string {
parsedNumber, err := phonenumbers.Parse(fmt.Sprintf("+%s", telephone), "")
if err != nil {
return ""
}
return fmt.Sprintf("%d", *parsedNumber.CountryCode)
}
func FormatToInternational(telephone string) string {
parsedNumber, err := phonenumbers.Parse(fmt.Sprintf("+%s", telephone), "")
if err != nil {
return ""
}
return phonenumbers.Format(parsedNumber, phonenumbers.INTERNATIONAL)
}
func FormatToE164(area, phone string) (string, error) {
parsedNumber, err := phonenumbers.Parse(fmt.Sprintf("+%s%s", area, phone), "")
if err != nil {
return "", err
}
return phonenumbers.Format(parsedNumber, phonenumbers.E164), nil
}
// MaskPhoneNumber 解析并脱敏电话号码
func MaskPhoneNumber(phone string) string {
// 解析电话号码
num, err := phonenumbers.Parse(phone, "")
if err != nil {
return ""
}
// 获取国际格式,如 "+1 512-345-6789"
formatted := phonenumbers.Format(num, phonenumbers.INTERNATIONAL)
// 使用正则匹配国家代码和号码部分
re := regexp.MustCompile(`(\+\d{1,3})\s*(.*)`)
matches := re.FindStringSubmatch(formatted)
if len(matches) < 3 {
return formatted // 如果格式不匹配,返回原格式
}
countryCode := matches[1] // 国家代码(如 "+1"
numberPart := matches[2] // 本地号码部分(如 "512-345-6789"
// 根据不同国家的号码格式进行脱敏
maskedNumber := maskDigits(numberPart, countryCode)
// 组合脱敏后的号码
return fmt.Sprintf("%s %s", countryCode, maskedNumber)
}
// maskDigits 替换部分数字,保持位数和分隔符
func maskDigits(number string, countryCode string) string {
// 统计数字个数
digitCount := 0
for _, r := range number {
if r >= '0' && r <= '9' {
digitCount++
}
}
// 处理不同国家的号码格式
runes := []rune(number)
digitIndex := 0
for i, r := range runes {
if r >= '0' && r <= '9' {
digitIndex++
if countryCode == "+1" { // 美国号码格式:+1 (512) ***-1278
if digitIndex > 3 && digitIndex <= digitCount-4 { // 只替换中间部分
runes[i] = '*'
}
} else if countryCode == "+86" { // 中国号码格式:+86 138 **** 5678
if digitIndex > 3 && digitIndex <= digitCount-4 {
runes[i] = '*'
}
} else { // 其他国家号码,采用类似规则
if digitIndex > 3 && digitIndex <= digitCount-4 {
runes[i] = '*'
}
}
}
}
return string(runes)
}
+57
View File
@@ -0,0 +1,57 @@
package phone
import (
"testing"
"github.com/nyaruka/phonenumbers"
)
func TestPhoneNumber(t *testing.T) {
parsedNumber, err := phonenumbers.Parse("+8615502505555", "")
if err != nil {
t.Fatalf("Failed to parse phone number: %v", err)
return
}
// 检查手机号是否有效
isValid := phonenumbers.IsValidNumber(parsedNumber)
// 获取区域代码 (如 CN, US, IN)
region := phonenumbers.GetRegionCodeForNumber(parsedNumber)
t.Log(isValid)
t.Log(region)
}
func TestCheck(t *testing.T) {
var phone = "15502505555"
if !Check("86", phone) {
t.Fatalf("Check phone number failed: %s", phone)
}
t.Logf("Check phone number success: %s", phone)
}
func TestGetCountryCode(t *testing.T) {
var phone = "14407941888"
countryCode := GetCountryCode(phone)
t.Logf("Country code: %s", countryCode)
}
func TestFormatToInternational(t *testing.T) {
var phone = "8615502505555"
international := FormatToInternational(phone)
t.Logf("International format: %s", international)
}
func TestFormatToE164(t *testing.T) {
var phone = "4407941888"
e164, err := FormatToE164("1", phone)
if err != nil {
t.Fatalf("Failed to format phone number to E164: %v", err)
return
}
t.Logf("E164 format: %s", e164)
}
func TestMask(t *testing.T) {
var phone = "+14407941888"
mask := MaskPhoneNumber(phone)
t.Logf("Mask format: %s", mask)
}