最近在做iPhone上的应用程序, 其中涉及到电话号码, 美国人喜欢自己常用的电话号码格式,就像iPhone拨号程序那样如: 1(234)567-8901这样的11位号码,查了一下iPhone的官方SDK没有找到需要的信息, 只好自己动手写一个简单的格式化函数。美国的电话号码有以下几种规则,比如11位的手机或者带国家代码的电话号码,前面已经提到了,超过11位则按正常的数字显示,不需要加任何格式;还有一种是10位号码,普通的日常应用的是7位电话号码,一般格式为:012-3456,以‘-’隔开前三位和后四位。超过7位的用(012)345-6789来表示,超过10位数字则按正常的数字号码显示,如01234567890. 好了, 知道了规则那么写程序就相对比较简单了, 代码如下

+(NSString*) encodePhoneNumber:(NSString*) phone
{
NSLocale* locale = [NSLocale currentLocale];
if( [[locale localeIdentifier] compare:@”en_US”]!=NSOrderedSame )
return phone;

if( [phone length]==0 )
return phone;
if( [phone rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet] ].location==NSNotFound )
{
const char* string = [phone UTF8String];
int length = [phone lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
if( [[NSString stringWithCString:string length:1] intValue]==1 )
{
if( length > 11 )
return phone;
NSMutableData* array = [[[NSMutableData alloc] init] autorelease];
// 1 (234) 567-8901
for( int i=0; i < length; i++ )
{
if( i==1 )
{
[array appendBytes:" (" length:2];
}
if( i == 4 )
{
[array appendBytes:") " length:2];
}
if( i==7 )
{
[array appendBytes:"-" length:1];
}
[array appendBytes:string++ length:1];
}
return [NSString stringWithUTF8String:(const char*)[array bytes]];
}
else
{
// (012) 345-6789
if( length > 10 )
return phone;
NSMutableData* array = [[[NSMutableData alloc] init] autorelease];
int i=0;
if( length <=7 )
{
for( i=0; i < length; i++ )
{
if( i==3 )
{
[array appendBytes:"-" length:1];
}
[array appendBytes:string++ length:1];
}
}
else
{
for( i=0; i < length; i++ )
{
if( i==0 )
[array appendBytes:"(" length:1];
if( i==3 )
[array appendBytes:") " length:2];
if( i==6 )
[array appendBytes:"-" length:1];
[array appendBytes:string++ length:1];
}
}
[array appendBytes:"/0" length:1];
return [NSString stringWithUTF8String:(const char*)[array bytes]];
}
}
return phone;
}