我有一个这样的字符串:+33123456789(法国电话号码).我想在不知道国家的情况下提取国家代码(+33).例如,如果我有来自其他国家的另一部电话,它应该可以工作.我使用谷歌库https://code.google.com/p/libphonenumber/.
如果我知道这个国家,很酷我可以找到国家代码:
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());
Run Code Online (Sandbox Code Playgroud)
但我找不到解析字符串而不知道国家的方法.
我正在考虑使用http://code.google.com/p/libphonenumber/来建立一个完善的项目.今天该项目不使用谷歌的JavaScript库,支持jQuery,jQueryUI,requirejs等.
libphonenumber看起来很棒...除了javascript版本(svn co http://libphonenumber.googlecode.com/svn/trunk/javascript/ libphonenumber-js)与goog.require调用相结合.如果运行演示(libphonenumber-js/i18n/phonenumbers/demo.html,如果你按建议检查),它会从closure-library.googlecode.com获取大量的谷歌库:
GET base.js
GET deps.js
GET error.js
GET string.js
GET asserts.js
GET array.js
GET useragent.js
GET browserfeature.js
GET tagname.js
GET classes.js
GET math.js
GET coordinate.js
GET size.js
GET object.js
GET dom.js
GET json.js
GET util.js
GET descriptor.js
GET fielddescriptor.js
GET message.js
GET serializer.js
GET objectserializer.js
GET stringbuffer.js
GET lazydeserializer.js
GET pbliteserializer.js
Run Code Online (Sandbox Code Playgroud)
我相信如果我使用闭包编译器编译它("如果你给use_closure_library参数赋值为true,编译器会在源代码中查找goog.require()语句,并提供任何此类语句所请求的Closure Library代码." ,https://developers.google.com/closure/compiler/docs/api-ref)我可以减少原始请求数量,但对于电话号码解析器而言,这似乎仍然是一个相当过量的内容,甚至是功能齐全的.
我的问题有两个可能的答案:
任何和所有建议最受赞赏.
我想要一个电话号码的国家代码列表.例如,United States(+1),United Kingdom(+44)......我知道libphonenumber是一个很好的工具,可以帮助解析电话,格式化和验证.但是,它似乎没有列出所有国家/地区代码的功能.但是这些数据应该在libphonenumber的元数据中,对吗?有没有人有这方面的经验?
我的目标是使用libphonenumber,google的电话号码处理库来处理我正在处理的iPhone项目.
下载后(和许多小时),我编译了库的C++版本,它构建了一个".a"文件和".dylib"文件,我假设我必须导入到我的xCodeProject才能访问那些C++函数.
所以我将"libphonenumber.a"导入到我的项目中,根据需要更新了我的目标,构建设置,构建阶段和库搜索路径.
为Device&Simulator传递构建xCode项目但是给我以下警告:"ld:warning:忽略文件../XcodeProjects/libphonenumber/build/libphonenumber.dylib,文件是为不支持的文件格式构建的,这不是架构所针对的链接(armv7)".(或编译模拟器时的i386)
我从中理解,我必须编译libphonenumber以获得正确的i386和/或armv7架构.所以我试着这样做,但很快意识到这也需要我重建libphonenumber的3个依赖库,对于i386/armv7架构来说,libphonenumber现在可以正确编译.最终,我放弃了它,它开始看起来像我之前的一团糟.
在我所有的考验之后,我离开了
3个问题:
1)如何编译libphonenumber C++库以与i386/armv6/armv7体系结构一起使用.
2)使用c ++库时,我的假设是正确的吗?是仅仅导入编译产生的".a"文件,只是在我的xCode项目文件的标题中指向它?包含和使用c ++库以及从xCode中的objective-c访问其函数的具体步骤是什么?
3)我确实找到了LPNKit,一个libphonenumber的Objective-c端口,但它不完整.有没有人听说过它,并且运气好吗?或者有没有人有libphonenumber的objective-c端口,它是完整的,有效的,有关如何正确编译和安装它的说明?
任何有关如何让这个库在iOS上运行的帮助或建议将不胜感激.
更新:
我最终使用了libphonenumber的javascript版本,将所有文件添加到我的包中,包括所有引用的javascript库,并使用UIWebview和stringByEvaluatingJavaScriptFromString来运行函数.您也可以让UIWebview在线引用javascript库(我只是希望将所有内容都设置为不依赖于Internet连接).
以下是我所做的一个示例:
webView_ = [[UIWebView alloc] init];
[webView_ loadHTMLString:
@"<script src='base.js'></script>"
"<script>"
"goog.require('goog.dom');"
"goog.require('goog.json');"
"goog.require('goog.proto2.ObjectSerializer');"
"goog.require('goog.string.StringBuffer');"
"</script>"
"<script src=\"phonemetadata.pb.js\"></script>"
"<script src=\"phonenumber.pb.js\"></script>"
"<script src=\"metadata.js\"></script>"
"<script src=\"phonenumberutil.js\"></script>"
"<script src=\"asyoutypeformatter.js\"></script>"
"<script src=\"normalize.js\"></script>"
baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] resourcePath]]];
NSString *function = [[NSString alloc] initWithFormat: @"phoneNumberParser('%@','%@','')", phoneNumber, ISOCountryCode];
NSLog(@"function is: %@", function);
NSString *result =[webView_ stringByEvaluatingJavaScriptFromString:function];
Run Code Online (Sandbox Code Playgroud)
结果变量获取格式化的数字.
我希望能帮助遇到同样问题的人.
库libphonenumber在Android上不起作用,异常说:"引起:java.lang.UnsupportedOperationException:不支持CANON_EQ标志"
网页上的描述说lib是针对"智能手机"但Android不支持CANON_EQ reg_ex标志.
我错过了什么吗?
在我的localhost开发期间,我试图自己托管libphonenumber库.我正在尝试以下方面:
<script src="//closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script>
<script>goog.require('goog.proto2.Message');</script>
<script src="scripts/vendor/pn/phonemetadata.pb.js"></script>
<script src="scripts/vendor/pn/phonenumber.pb.js"></script>
<script src="scripts/vendor/pn/metadata.js"></script>
<script src="scripts/vendor/pn/phonenumberutil.js"></script>
<script src="scripts/vendor/pn/asyoutypeformatter.js"></script>
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我仍然依赖于外部托管的组件:闭包库.我尝试过使用closure-lite,它(显然,我是新来的)是一个非常完整的闭包库版本,可用于自托管.我尝试过以下操作:
<script src="scripts/vendor/closure-lite.js"></script>
<script>goog.require('goog.proto2.Message');</script>
<script src="scripts/vendor/pn/phonemetadata.pb.js"></script>
<script src="scripts/vendor/pn/phonenumber.pb.js"></script>
<script src="scripts/vendor/pn/metadata.js"></script>
<script src="scripts/vendor/pn/phonenumberutil.js"></script>
<script src="scripts/vendor/pn/asyoutypeformatter.js"></script>
Run Code Online (Sandbox Code Playgroud)
但是goog.proto2.Message没有.我收到以下错误:
Uncaught TypeError: Cannot read property 'Message' of undefined
Run Code Online (Sandbox Code Playgroud)
该错误来自phonemetadata.pb.js脚本:
goog.inherits(i18n.phonenumbers.NumberFormat, goog.proto2.Message);
Run Code Online (Sandbox Code Playgroud)
我能做些什么才能完全自我主持libphonenumber?
我有一个号码需要格式化为电话号码.如果我做
PhoneNumberUtils.formatNumber(numStr);
Run Code Online (Sandbox Code Playgroud)
然后我明白了
888-555-1234
Run Code Online (Sandbox Code Playgroud)
但我需要得到的是
(888) 555-1234
Run Code Online (Sandbox Code Playgroud)
我如何获得第二个?有标准的android方式吗?
我从看起来很棒的图书馆听到了很多好消息,但我发现自己处于一种微妙的境地。
这是我工作过的第一个项目,我应该将电话号码存储在数据库中。
我已经阅读了一些关于E.164格式的内容,我确实打算将所有使用这种格式的电话号码存储在我的数据库中。
我面临的问题是数据源。我无法控制数据源。我所知道的是,我收到了一堆电话号码,而且它们的格式不一致。有些有国际分机,有些没有。有些有括号、连字符、前导 0 等,有些没有。
我怎么可能从所述来源中提取电话号码,将它们格式化为 E.164,以便我可以安全地存储它们?
我尝试在PhoneNumberUtil#parse()不提供国家代码的情况下使用该方法,因为我无法访问该信息。
看看下面的例子:
System.out.printLn("Number -> " + phoneNumberUtil.parse("00336555233634", null).toString())
Run Code Online (Sandbox Code Playgroud)
错误类型:INVALID_COUNTRY_CODE。缺少或无效的默认区域。
在我的例子中,号码是法国手机的号码。0我相信,如果您从法国以外的地方拨打电话,则这两个启动项都有效。
但是图书馆无法理解它,因为它正在吸收国家/地区代码。 这是否意味着不存在了解该特定电话号码来自何处的方法?
文档似乎很清楚:
public PhoneNumber parse(CharSequence numberToParse, String defaultRegion)
Run Code Online (Sandbox Code Playgroud)
@param defaultRegion 我们期望数字来自的区域。仅当 * 解析的数字不是以国际格式写入时才使用。
在这种情况下,*编号的国家/地区代码将作为提供的默认区域的国家/地区代码存储。如果数字 * 保证以“+”开头,后跟国家/地区调用代码,则可以提供 RegionCode.ZZ * 或 null。
所以,如果添加 +33
System.out.printLn("Number -> " + phoneNumberUtil.parse("+336555233634", null).toString())
Run Code Online (Sandbox Code Playgroud)
那么结果自然是:
号码 -> 国家代码:33 国家号码:336555233634
如果最终用户向我的应用提供不以 开头的电话号码,我应该/可以做什么+?如果出现这种情况,我无法相信我是唯一的人。
谢谢您的帮助 !
我有一个Android应用程序,它使用谷歌的libphonenumber,每次libphonenumber有区域代码和运营商号码"元数据"的更新,我必须逐字地重新打包应用程序与更新版本的库并释放它.
我的问题是,是否有人可以指导或向我展示更新已安装/正在运行的Android应用程序上的libphonenumber元数据的方法,而无需在每次更新时都构建新版本.
先感谢您,
我正在尝试创建一个格式化和验证我的angualr 4应用程序中的电话号码的指令,正在寻找一些入门指导.
libphonenumber ×10
android ×4
phone-number ×3
java ×2
contacts ×1
ios ×1
iphone ×1
javascript ×1
numbers ×1
objective-c ×1