问题描述
|
这是一个普遍的问题,但特别是在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\",....
希望能帮助到别人!