【问题标题】:Convert Phone Number to International with Country Code iOS使用国家代码 iOS 将电话号码转换为国际电话号码
【发布时间】:2015-01-19 11:10:38
【问题描述】:

我有一个应用程序可以读取用户的联系人列表,但我需要将每个号码转换为带有国家代码的国际等效号码。例如,如果一个号码是 07777777777,那么结果将是 +447777777777,或者如果一个来自土耳其的号码是 0090,它将替换为 +90。

- (NSString *)ConvertNumberToInternational:(NSString *)number {
if(number != nil) {
    if(number.length > 0) {
        NSLocale *locale = [NSLocale currentLocale];
        NSString *countryCode = [locale objectForKey: NSLocaleCountryCode];
        NSDictionary *dict = [self dictCountryCodes];
        number = [number stringByReplacingOccurrencesOfString:@" " withString:@""];
        if([[number substringToIndex:1] isEqualToString:@"0"] && ![[number substringToIndex:2] isEqualToString:@"00"]) {
            number = [NSString stringWithFormat:@"+44%@", [number stringByReplacingCharactersInRange:[number rangeOfString:@"0"] withString:@""]];
        }
        if([[number substringToIndex:2] isEqualToString:@"00"]) {
            number = [NSString stringWithFormat:@"+%@%@", [dict objectForKey:countryCode], [number substringFromIndex:2]];
        }
        number = [number stringByReplacingOccurrencesOfString:@" "  withString:@""];
    }
}
return number;
}

-(NSDictionary *)dictCountryCodes{
NSDictionary *dictCodes = [NSDictionary dictionaryWithObjectsAndKeys:
                           @"93", @"AF",@"20",@"EG", @"355", @"AL", @"213", @"DZ", @"1", @"AS",
                           @"376", @"AD", @"244", @"AO", @"1", @"AI", @"1", @"AG",
                           @"54", @"AR", @"374", @"AM", @"297", @"AW", @"61", @"AU",
                           @"43", @"AT", @"994", @"AZ", @"1", @"BS", @"973", @"BH",
                           @"880", @"BD", @"1", @"BB", @"375", @"BY", @"32", @"BE",
                           @"501", @"BZ", @"229", @"BJ", @"1", @"BM", @"975", @"BT",
                           @"387", @"BA", @"267", @"BW", @"55", @"BR", @"246", @"IO",
                           @"359", @"BG", @"226", @"BF", @"257", @"BI", @"855", @"KH",
                           @"237", @"CM", @"1", @"CA", @"238", @"CV", @"345", @"KY",
                           @"236", @"CF", @"235", @"TD", @"56", @"CL", @"86", @"CN",
                           @"61", @"CX", @"57", @"CO", @"269", @"KM", @"242", @"CG",
                           @"682", @"CK", @"506", @"CR", @"385", @"HR", @"53", @"CU",
                           @"537", @"CY", @"420", @"CZ", @"45", @"DK", @"253", @"DJ",
                           @"1", @"DM", @"1", @"DO", @"593", @"EC", @"20", @"EG",
                           @"503", @"SV", @"240", @"GQ", @"291", @"ER", @"372", @"EE",
                           @"251", @"ET", @"298", @"FO", @"679", @"FJ", @"358", @"FI",
                           @"33", @"FR", @"594", @"GF", @"689", @"PF", @"241", @"GA",
                           @"220", @"GM", @"995", @"GE", @"49", @"DE", @"233", @"GH",
                           @"350", @"GI", @"30", @"GR", @"299", @"GL", @"1", @"GD",
                           @"590", @"GP", @"1", @"GU", @"502", @"GT", @"224", @"GN",
                           @"245", @"GW", @"595", @"GY", @"509", @"HT", @"504", @"HN",
                           @"36", @"HU", @"354", @"IS", @"91", @"IN", @"62", @"ID",
                           @"964", @"IQ", @"353", @"IE", @"972", @"IL", @"39", @"IT",
                           @"1", @"JM", @"81", @"JP", @"962", @"JO", @"77", @"KZ",
                           @"254", @"KE", @"686", @"KI", @"965", @"KW", @"996", @"KG",
                           @"371", @"LV", @"961", @"LB", @"266", @"LS", @"231", @"LR",
                           @"423", @"LI", @"370", @"LT", @"352", @"LU", @"261", @"MG",
                           @"265", @"MW", @"60", @"MY", @"960", @"MV", @"223", @"ML",
                           @"356", @"MT", @"692", @"MH", @"596", @"MQ", @"222", @"MR",
                           @"230", @"MU", @"262", @"YT", @"52", @"MX", @"377", @"MC",
                           @"976", @"MN", @"382", @"ME", @"1", @"MS", @"212", @"MA",
                           @"95", @"MM", @"264", @"NA", @"674", @"NR", @"977", @"NP",
                           @"31", @"NL", @"599", @"AN", @"687", @"NC", @"64", @"NZ",
                           @"505", @"NI", @"227", @"NE", @"234", @"NG", @"683", @"NU",
                           @"672", @"NF", @"1", @"MP", @"47", @"NO", @"968", @"OM",
                           @"92", @"PK", @"680", @"PW", @"507", @"PA", @"675", @"PG",
                           @"595", @"PY", @"51", @"PE", @"63", @"PH", @"48", @"PL",
                           @"351", @"PT", @"1", @"PR", @"974", @"QA", @"40", @"RO",
                           @"250", @"RW", @"685", @"WS", @"378", @"SM", @"966", @"SA",
                           @"221", @"SN", @"381", @"RS", @"248", @"SC", @"232", @"SL",
                           @"65", @"SG", @"421", @"SK", @"386", @"SI", @"677", @"SB",
                           @"27", @"ZA", @"500", @"GS", @"34", @"ES", @"94", @"LK",
                           @"249", @"SD", @"597", @"SR", @"268", @"SZ", @"46", @"SE",
                           @"41", @"CH", @"992", @"TJ", @"66", @"TH", @"228", @"TG",
                           @"690", @"TK", @"676", @"TO", @"1", @"TT", @"216", @"TN",
                           @"90", @"TR", @"993", @"TM", @"1", @"TC", @"688", @"TV",
                           @"256", @"UG", @"380", @"UA", @"971", @"AE", @"44", @"GB",
                           @"1", @"US", @"598", @"UY", @"998", @"UZ", @"678", @"VU",
                           @"681", @"WF", @"967", @"YE", @"260", @"ZM", @"263", @"ZW",
                           @"591", @"BO", @"673", @"BN", @"61", @"CC", @"243", @"CD",
                           @"225", @"CI", @"500", @"FK", @"44", @"GG", @"379", @"VA",
                           @"852", @"HK", @"98", @"IR", @"44", @"IM", @"44", @"JE",
                           @"850", @"KP", @"82", @"KR", @"856", @"LA", @"218", @"LY",
                           @"853", @"MO", @"389", @"MK", @"691", @"FM", @"373", @"MD",
                           @"258", @"MZ", @"970", @"PS", @"872", @"PN", @"262", @"RE",
                           @"7", @"RU", @"590", @"BL", @"290", @"SH", @"1", @"KN",
                           @"1", @"LC", @"590", @"MF", @"508", @"PM", @"1", @"VC",
                           @"239", @"ST", @"252", @"SO", @"47", @"SJ", @"963", @"SY",
                           @"886", @"TW", @"255", @"TZ", @"670", @"TL", @"58", @"VE",
                           @"84", @"VN", @"1", @"VG", @"1", @"VI", nil];

return dictCodes;
}

上面的代码不起作用,因为我只是使用用户当前的语言环境。我需要知道电话号码的区域设置。任何帮助将不胜感激!

【问题讨论】:

  • 所以你假设 0 始终是 iphone 区域,00 是国际号码“前缀”
  • 我已经编辑了我的帖子以显示我目前拥有的内容,但存在 nslocale 问题
  • 不明白为什么需要代码
  • 因为需要国家代码,所以把0换成+
  • 但无论如何你都有+...请用几个数字试试我的答案

标签: ios objective-c


【解决方案1】:

所以你假设 0 始终是 iphone 地区,00 是国际号码“前缀” -

#import <Foundation/Foundation.h>

@interface T : NSObject
@end

@implementation T

- (NSString *)convertNumberToInternational:(NSString *)number {
    if(number != nil) {
        if(number.length > 0) {
            NSLocale *locale = [NSLocale currentLocale];
            NSString *countryCode = [locale objectForKey: NSLocaleCountryCode];
            NSDictionary *dict = [self dictCountryCodes];
            NSString *localNumberCode = dict[countryCode];

            number = [number stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

            if([[number substringToIndex:1] isEqualToString:@"0"] && ![[number substringToIndex:2] isEqualToString:@"00"]) {
                number = [NSString stringWithFormat:@"+%@%@", localNumberCode, [number substringFromIndex:1]];
            }
            else if([[number substringToIndex:2] isEqualToString:@"00"]) {
                number = [NSString stringWithFormat:@"+%@", [number substringFromIndex:2]];
            }
        }
    }
    return number;
}

-(NSDictionary *)dictCountryCodes{
NSDictionary *dictCodes = [NSDictionary dictionaryWithObjectsAndKeys:
                           @"93", @"AF",@"20",@"EG", @"355", @"AL", @"213", @"DZ", @"1", @"AS",
                           @"376", @"AD", @"244", @"AO", @"1", @"AI", @"1", @"AG",
                           @"54", @"AR", @"374", @"AM", @"297", @"AW", @"61", @"AU",
                           @"43", @"AT", @"994", @"AZ", @"1", @"BS", @"973", @"BH",
                           @"880", @"BD", @"1", @"BB", @"375", @"BY", @"32", @"BE",
                           @"501", @"BZ", @"229", @"BJ", @"1", @"BM", @"975", @"BT",
                           @"387", @"BA", @"267", @"BW", @"55", @"BR", @"246", @"IO",
                           @"359", @"BG", @"226", @"BF", @"257", @"BI", @"855", @"KH",
                           @"237", @"CM", @"1", @"CA", @"238", @"CV", @"345", @"KY",
                           @"236", @"CF", @"235", @"TD", @"56", @"CL", @"86", @"CN",
                           @"61", @"CX", @"57", @"CO", @"269", @"KM", @"242", @"CG",
                           @"682", @"CK", @"506", @"CR", @"385", @"HR", @"53", @"CU",
                           @"537", @"CY", @"420", @"CZ", @"45", @"DK", @"253", @"DJ",
                           @"1", @"DM", @"1", @"DO", @"593", @"EC", @"20", @"EG",
                           @"503", @"SV", @"240", @"GQ", @"291", @"ER", @"372", @"EE",
                           @"251", @"ET", @"298", @"FO", @"679", @"FJ", @"358", @"FI",
                           @"33", @"FR", @"594", @"GF", @"689", @"PF", @"241", @"GA",
                           @"220", @"GM", @"995", @"GE", @"49", @"DE", @"233", @"GH",
                           @"350", @"GI", @"30", @"GR", @"299", @"GL", @"1", @"GD",
                           @"590", @"GP", @"1", @"GU", @"502", @"GT", @"224", @"GN",
                           @"245", @"GW", @"595", @"GY", @"509", @"HT", @"504", @"HN",
                           @"36", @"HU", @"354", @"IS", @"91", @"IN", @"62", @"ID",
                           @"964", @"IQ", @"353", @"IE", @"972", @"IL", @"39", @"IT",
                           @"1", @"JM", @"81", @"JP", @"962", @"JO", @"77", @"KZ",
                           @"254", @"KE", @"686", @"KI", @"965", @"KW", @"996", @"KG",
                           @"371", @"LV", @"961", @"LB", @"266", @"LS", @"231", @"LR",
                           @"423", @"LI", @"370", @"LT", @"352", @"LU", @"261", @"MG",
                           @"265", @"MW", @"60", @"MY", @"960", @"MV", @"223", @"ML",
                           @"356", @"MT", @"692", @"MH", @"596", @"MQ", @"222", @"MR",
                           @"230", @"MU", @"262", @"YT", @"52", @"MX", @"377", @"MC",
                           @"976", @"MN", @"382", @"ME", @"1", @"MS", @"212", @"MA",
                           @"95", @"MM", @"264", @"NA", @"674", @"NR", @"977", @"NP",
                           @"31", @"NL", @"599", @"AN", @"687", @"NC", @"64", @"NZ",
                           @"505", @"NI", @"227", @"NE", @"234", @"NG", @"683", @"NU",
                           @"672", @"NF", @"1", @"MP", @"47", @"NO", @"968", @"OM",
                           @"92", @"PK", @"680", @"PW", @"507", @"PA", @"675", @"PG",
                           @"595", @"PY", @"51", @"PE", @"63", @"PH", @"48", @"PL",
                           @"351", @"PT", @"1", @"PR", @"974", @"QA", @"40", @"RO",
                           @"250", @"RW", @"685", @"WS", @"378", @"SM", @"966", @"SA",
                           @"221", @"SN", @"381", @"RS", @"248", @"SC", @"232", @"SL",
                           @"65", @"SG", @"421", @"SK", @"386", @"SI", @"677", @"SB",
                           @"27", @"ZA", @"500", @"GS", @"34", @"ES", @"94", @"LK",
                           @"249", @"SD", @"597", @"SR", @"268", @"SZ", @"46", @"SE",
                           @"41", @"CH", @"992", @"TJ", @"66", @"TH", @"228", @"TG",
                           @"690", @"TK", @"676", @"TO", @"1", @"TT", @"216", @"TN",
                           @"90", @"TR", @"993", @"TM", @"1", @"TC", @"688", @"TV",
                           @"256", @"UG", @"380", @"UA", @"971", @"AE", @"44", @"GB",
                           @"1", @"US", @"598", @"UY", @"998", @"UZ", @"678", @"VU",
                           @"681", @"WF", @"967", @"YE", @"260", @"ZM", @"263", @"ZW",
                           @"591", @"BO", @"673", @"BN", @"61", @"CC", @"243", @"CD",
                           @"225", @"CI", @"500", @"FK", @"44", @"GG", @"379", @"VA",
                           @"852", @"HK", @"98", @"IR", @"44", @"IM", @"44", @"JE",
                           @"850", @"KP", @"82", @"KR", @"856", @"LA", @"218", @"LY",
                           @"853", @"MO", @"389", @"MK", @"691", @"FM", @"373", @"MD",
                           @"258", @"MZ", @"970", @"PS", @"872", @"PN", @"262", @"RE",
                           @"7", @"RU", @"590", @"BL", @"290", @"SH", @"1", @"KN",
                           @"1", @"LC", @"590", @"MF", @"508", @"PM", @"1", @"VC",
                           @"239", @"ST", @"252", @"SO", @"47", @"SJ", @"963", @"SY",
                           @"886", @"TW", @"255", @"TZ", @"670", @"TL", @"58", @"VE",
                           @"84", @"VN", @"1", @"VG", @"1", @"VI", nil];

return dictCodes;
}
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        T*t = [[T alloc] init];
        NSLog(@"%@", [t convertNumberToInternational:@"05135897"]);
        NSLog(@"%@", [t convertNumberToInternational:@"00995135897"]);
    }
}

【讨论】:

  • 修复了之前也存在的问题,0 可能位于末尾或中间
  • 你必须做什么才能使它通用,使 00 前缀模块化,因为在某些国家它不是 00,而是例如19 或其他表示国际号码的数字
  • 接受的答案没有解决问题,因为 localNumberCode 将始终是用户的语言环境,而不是联系人列表中的电话号码之一。
  • 你错了。数字中没有国家代码 = 当前国家。这就是它的一般情况和操作描述的内容。它很合适。 -- 你想要什么?也许您想根据联系人地址假设一个国家/地区。还有两行,但不是这里要求的内容
  • 我的错。你说得对。我正在努力解决这个问题,这让我的想法变得扭曲了。我认为这真的很难(不可能?)。试图通过查看国家号码来找出国家代码。我最终使用了 google libPhoneNumber 库。并不能完全满足我的需求,但已经足够好了。
【解决方案2】:

也许你可以使用NSFormatter 类。

验证电话号码的总长度。 (将输入并读取为NSString

您可能需要做的事情很少,请跳过第一部分,即0

【讨论】:

  • 我只是好奇。我们如何按长度验证号码,每个国家/地区都有不同的电话号码长度。
  • @Kampai:必须在提到它的地方作为 coredata/plist 给出。
  • 好的,所以我们需要一些预先收集的每个国家号码长度的信息,否则必须使用任何开源网络服务对吗?
  • @Kampai:是的。因为我不确定是否有任何此类网络服务或预定义列表可用。甚至它可能会在适当的时候改变。
  • 我已经编辑了我的帖子以显示我到目前为止的内容,但是存在 nslocale 问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2012-01-14
  • 2016-04-16
相关资源
最近更新 更多