规范用户通讯录中电话号码的策略?

问题描述

| 这是一个普遍的问题,但特别是在Android和iPhone上影响着我:给定用户和电话号码,我该如何规范化该电话号码以真正用于存储和拨号?用户可以在其地址簿中使用以下格式填写电话号码: 7位美国号码(555-1212) 10位美国号码(210-555-1212) 国际电话+(+ 46-555-1212) 国内非美国电话(123-555-1212) 国内非美国截断号码(555-1212) 我对用户提交此号码的了解: IP地址 也许他们的电话号码 也许他们选择的国家 也许他们选择的地区 这似乎是一个棘手的问题-除非我确实需要,否则我绝对不希望向用户提供更多信息,但是此数据必须非常可靠。有没有可以在这里重用的最佳实践?     

解决方法

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\",....
希望能帮助到别人!