从用户的地址簿规范化电话号码的策略?

时间:2011-04-15 01:07:25

标签: android ios mobile phone-number

这是一个普遍的问题,但对我和Android有特别的影响:给定一个用户和一个电话号码,我如何规范化该电话号码才能真正用于存储和拨号?用户可以在表单的地址簿中输入电话号码:

  • 7位数的美国号码(555-1212)
  • 10位数的美国号码(210-555-1212)
  • 国际号码+(+ 46-555-1212)
  • 国内非美国完整号码(123-555-1212)
  • 国内非美国截断号码(555-1212)

我知道用户提交此号码的事项:

  • IP地址
  • 可能他们的电话号码
  • 可能他们选择的国家/地区
  • 可能他们选择的地区

这似乎是一个棘手的问题 - 我绝对不想要求用户提供更多信息,除非我真的需要,但这些数据需要非常值得信赖。我可以在这里重复使用最佳实践吗?

1 个答案:

答案 0 :(得分:0)

<强> IOS

好的,这可能对你很有帮助。我们希望如此。

在我的应用程序中,我需要 - 以某种方式从联系人处获取电话号码。所以问题就在于你所解释的 - 可以使用各种 - *()字符,以及没有国家代码。

所以 - 我使用ABPeoplePickerNavigationController获取联系电话号码并使用函数来获取数字真实数字和可能的国家/地区代码:

- (void)saveContactPhone:(NSString *) mContactPhone
{
    if(mContactPhone && [mContactPhone length])
    {   
        if ([mContactPhone rangeOfString:@"+"].location != NSNotFound)//this means number includes country code. 
        {
            NSString * mCCodeString = @"";

            BOOL mFound = FALSE;

            for(int i = 0; i<[mContactPhone length]; i++) // check number for any obvious country code.
            {
                if(mFound == TRUE)
                {
                    break;
                }

                mCCodeString = [mContactPhone substringToIndex:i];

                mCCodeString = [[mCCodeString componentsSeparatedByCharactersInSet:
                [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
                componentsJoinedByString:@""];

                if([mCCodeString intValue] != 1)//because This is US/CA
                {
                    for(int j = 0; j<[pickerViewElementArray_ count]; j++)
                    { 
                        if([[pickerViewElementArray_ objectAtIndex:j] intValue] == [mCCodeString intValue])
                        {
                            mFound = TRUE;

                            //we got ourselves final telephone number 
                            //and we got country code!!

                            mContactPhone = [mContactPhone substringFromIndex:i];

                            break;
                        }
                    }
                }

            }

            if(mFound == FALSE)//If no luck finding a match - lets try again, but til index 2. (find if it is +1)
            {
                mCCodeString = [mContactPhone substringToIndex:2];

                mCCodeString = [[mCCodeString componentsSeparatedByCharactersInSet:
                [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
                componentsJoinedByString:@""];

                mContactPhone = [mContactPhone substringFromIndex:1];

                for(int i = 0; i<[pickerViewElementArray_ count]; i++)
                { 
                    if([[pickerViewElementArray_ objectAtIndex:i] intValue] == [mCCodeString intValue])
                    {   
                        //we found it!! Its +1!!!!

                        mFound = TRUE;

                        break;
                    }
                }
            }
        }
    }

    mContactPhone = [[mContactPhone componentsSeparatedByCharactersInSet:
            [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
            componentsJoinedByString:@""];
}

您还需要国家/地区代码数组:例如:

NSArray *pickerViewElementArray_ = [NSArray arrayWithObjects: 
    @"93",
    @"355",
    @"213",
    @"1684",
    @"376",
    @"244",
    ....

希望能帮助别人!