【问题标题】:What do "strict" or "loose" comparisons mean for PhoneNumberUtils.compare?对于 PhoneNumberUtils.compare,“严格”或“松散”比较意味着什么?
【发布时间】:2018-11-23 11:43:23
【问题描述】:

PhoneNumberUtils.compare 和签名(Context context, String a, String b) 让您可以比较两个电话号码,看看它们是否相等。文档说:

检查资源以确定是使用严格比较算法还是松散比较算法。

这是什么意思?它如何检查资源以确定使用哪种算法,以及这些算法有何不同?

【问题讨论】:

  • 就资源而言,它在Context 上调用getResources().getBoolean() 以检索将由运营商设置的bool;即config_use_strict_phone_number_comparation。至于算法,它们相当复杂且乏味。但是,主要区别在于,松散算法基本上只是对字符数据进行盲比,从右到左,这通常足以满足国内号码的来电显示。严格的算法考虑了国际电话集群的各种古怪细节。
  • @MikeM。谢谢,听起来像是一个回答帖子!
  • 我可能可以做到这一点。 :-) 我不确定你想要多少关于算法的细节。坦率地说,严格的有点让人麻木,我从来没有费心去完全消化它。酷,给我一分钟格式化。谢谢!

标签: android


【解决方案1】:

它如何检查资源以确定使用哪种算法

它在Context 参数上调用getResources().getBoolean() 以检索将由运营商设置的bool 资源;即:

com.android.internal.R.bool.config_use_strict_phone_number_comparation

请注意,compare(String a, String b) 方法自动使用松散方法。

算法有何不同?

两者都相当复杂且乏味,但主要区别在于松散算法基本上是从右到左进行盲字符比较,几乎只考虑格式差异。这对于拨打国内电话来说通常绰绰有余。

然而,严格的算法会考虑国际号码的各种分钟规则及其不同的可接受差异;例如,如来源中所述,“090-1234-1234 在日本不得等于 90-1234-1234”。

这些算法(当前)在the source code for PhoneNumberUtils 中名为compareLoosely()compareStrictly() 的方法中。我没有直接链接到行号,因为那是主分支,它们最终肯定会改变。

基本上,如果您相对确定您将只处理国内号码,那么松散的方法可能没问题。如果您要处理国际号码,请使用严格方法。

【讨论】:

  • 就我而言,由于我正在编译启用了内部方法的应用程序,你知道我是否可以直接调用 compareStrictly(),或者这样做有什么缺点吗?就像,如果布尔值返回 false(在我的情况下,它只是抛出 NotFoundException,所以 wtf),我仍然调用严格方法是否有问题?我一直在尝试使用它。但我不知道这取决于运营商还是我可以强迫它。
  • 从我刚才的尝试来看,我的运营商似乎有 false 或其他东西的布尔值。使用 1-650-555-1234 / 650-555-1234 和 090-1234-1234 / 90-1234-1234,compare(Context,String,String)compareLoosely(String,String) 两者都返回 true,这是错误的。然后compareStrictly(String,String) 第一个为真,第二个为假,这是正确的,根据compareStrictly(String,String,boolean) 的文档。似乎工作得很好,即使普通方法默认情况下不会使用严格版本。只是不知道强迫它有没有坏处。
猜你喜欢
  • 2020-10-12
  • 2018-04-21
  • 1970-01-01
  • 2015-03-12
  • 2015-07-30
  • 2011-12-28
  • 2011-06-11
  • 2010-10-02
  • 2013-01-16
相关资源
最近更新 更多