What do “strict” or “loose” comparisons mean for PhoneNumberUtils.compare?












1















PhoneNumberUtils.compare with the signature (Context context, String a, String b) lets you compare two phone numbers to see if they are equal. The documentation says:




Checks a resource to determine whether to use a strict or loose comparison algorithm.




What does this mean? How is it checking a resource to determine which algorithm to use, and how do the algorithms differ?










share|improve this question























  • As far as the resource, it calls getResources().getBoolean() on the Context to retrieve a bool that would be set by the carrier; namely config_use_strict_phone_number_comparation. As for the algorithms, they're rather involved, and tedious. However, the main difference is that the loose algorithm is basically just doing blind comparisons of the character data, right to left, which usually suffices for caller ID on domestic numbers. The strict algorithm takes into account all sorts of wacky minutiae for the cluster that is international telephony.

    – Mike M.
    Nov 23 '18 at 12:41











  • If you like, you can have a look at the source. The loose algorithm: android.googlesource.com/platform/frameworks/base/+/master/…. And the strict: android.googlesource.com/platform/frameworks/base/+/master/….

    – Mike M.
    Nov 23 '18 at 12:41











  • @MikeM. Thanks, sounds like an answer post!

    – Flimm
    Nov 23 '18 at 12:42











  • I could probably manage that. :-) I wasn't sure how much detail you wanted concerning the algorithms. Frankly, the strict one is a little mind numbing, and I've never bothered to fully digest it. Cool, gimme a minute to format. Thanks!

    – Mike M.
    Nov 23 '18 at 12:45
















1















PhoneNumberUtils.compare with the signature (Context context, String a, String b) lets you compare two phone numbers to see if they are equal. The documentation says:




Checks a resource to determine whether to use a strict or loose comparison algorithm.




What does this mean? How is it checking a resource to determine which algorithm to use, and how do the algorithms differ?










share|improve this question























  • As far as the resource, it calls getResources().getBoolean() on the Context to retrieve a bool that would be set by the carrier; namely config_use_strict_phone_number_comparation. As for the algorithms, they're rather involved, and tedious. However, the main difference is that the loose algorithm is basically just doing blind comparisons of the character data, right to left, which usually suffices for caller ID on domestic numbers. The strict algorithm takes into account all sorts of wacky minutiae for the cluster that is international telephony.

    – Mike M.
    Nov 23 '18 at 12:41











  • If you like, you can have a look at the source. The loose algorithm: android.googlesource.com/platform/frameworks/base/+/master/…. And the strict: android.googlesource.com/platform/frameworks/base/+/master/….

    – Mike M.
    Nov 23 '18 at 12:41











  • @MikeM. Thanks, sounds like an answer post!

    – Flimm
    Nov 23 '18 at 12:42











  • I could probably manage that. :-) I wasn't sure how much detail you wanted concerning the algorithms. Frankly, the strict one is a little mind numbing, and I've never bothered to fully digest it. Cool, gimme a minute to format. Thanks!

    – Mike M.
    Nov 23 '18 at 12:45














1












1








1








PhoneNumberUtils.compare with the signature (Context context, String a, String b) lets you compare two phone numbers to see if they are equal. The documentation says:




Checks a resource to determine whether to use a strict or loose comparison algorithm.




What does this mean? How is it checking a resource to determine which algorithm to use, and how do the algorithms differ?










share|improve this question














PhoneNumberUtils.compare with the signature (Context context, String a, String b) lets you compare two phone numbers to see if they are equal. The documentation says:




Checks a resource to determine whether to use a strict or loose comparison algorithm.




What does this mean? How is it checking a resource to determine which algorithm to use, and how do the algorithms differ?







android






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 23 '18 at 11:43









FlimmFlimm

52.2k23136157




52.2k23136157













  • As far as the resource, it calls getResources().getBoolean() on the Context to retrieve a bool that would be set by the carrier; namely config_use_strict_phone_number_comparation. As for the algorithms, they're rather involved, and tedious. However, the main difference is that the loose algorithm is basically just doing blind comparisons of the character data, right to left, which usually suffices for caller ID on domestic numbers. The strict algorithm takes into account all sorts of wacky minutiae for the cluster that is international telephony.

    – Mike M.
    Nov 23 '18 at 12:41











  • If you like, you can have a look at the source. The loose algorithm: android.googlesource.com/platform/frameworks/base/+/master/…. And the strict: android.googlesource.com/platform/frameworks/base/+/master/….

    – Mike M.
    Nov 23 '18 at 12:41











  • @MikeM. Thanks, sounds like an answer post!

    – Flimm
    Nov 23 '18 at 12:42











  • I could probably manage that. :-) I wasn't sure how much detail you wanted concerning the algorithms. Frankly, the strict one is a little mind numbing, and I've never bothered to fully digest it. Cool, gimme a minute to format. Thanks!

    – Mike M.
    Nov 23 '18 at 12:45



















  • As far as the resource, it calls getResources().getBoolean() on the Context to retrieve a bool that would be set by the carrier; namely config_use_strict_phone_number_comparation. As for the algorithms, they're rather involved, and tedious. However, the main difference is that the loose algorithm is basically just doing blind comparisons of the character data, right to left, which usually suffices for caller ID on domestic numbers. The strict algorithm takes into account all sorts of wacky minutiae for the cluster that is international telephony.

    – Mike M.
    Nov 23 '18 at 12:41











  • If you like, you can have a look at the source. The loose algorithm: android.googlesource.com/platform/frameworks/base/+/master/…. And the strict: android.googlesource.com/platform/frameworks/base/+/master/….

    – Mike M.
    Nov 23 '18 at 12:41











  • @MikeM. Thanks, sounds like an answer post!

    – Flimm
    Nov 23 '18 at 12:42











  • I could probably manage that. :-) I wasn't sure how much detail you wanted concerning the algorithms. Frankly, the strict one is a little mind numbing, and I've never bothered to fully digest it. Cool, gimme a minute to format. Thanks!

    – Mike M.
    Nov 23 '18 at 12:45

















As far as the resource, it calls getResources().getBoolean() on the Context to retrieve a bool that would be set by the carrier; namely config_use_strict_phone_number_comparation. As for the algorithms, they're rather involved, and tedious. However, the main difference is that the loose algorithm is basically just doing blind comparisons of the character data, right to left, which usually suffices for caller ID on domestic numbers. The strict algorithm takes into account all sorts of wacky minutiae for the cluster that is international telephony.

– Mike M.
Nov 23 '18 at 12:41





As far as the resource, it calls getResources().getBoolean() on the Context to retrieve a bool that would be set by the carrier; namely config_use_strict_phone_number_comparation. As for the algorithms, they're rather involved, and tedious. However, the main difference is that the loose algorithm is basically just doing blind comparisons of the character data, right to left, which usually suffices for caller ID on domestic numbers. The strict algorithm takes into account all sorts of wacky minutiae for the cluster that is international telephony.

– Mike M.
Nov 23 '18 at 12:41













If you like, you can have a look at the source. The loose algorithm: android.googlesource.com/platform/frameworks/base/+/master/…. And the strict: android.googlesource.com/platform/frameworks/base/+/master/….

– Mike M.
Nov 23 '18 at 12:41





If you like, you can have a look at the source. The loose algorithm: android.googlesource.com/platform/frameworks/base/+/master/…. And the strict: android.googlesource.com/platform/frameworks/base/+/master/….

– Mike M.
Nov 23 '18 at 12:41













@MikeM. Thanks, sounds like an answer post!

– Flimm
Nov 23 '18 at 12:42





@MikeM. Thanks, sounds like an answer post!

– Flimm
Nov 23 '18 at 12:42













I could probably manage that. :-) I wasn't sure how much detail you wanted concerning the algorithms. Frankly, the strict one is a little mind numbing, and I've never bothered to fully digest it. Cool, gimme a minute to format. Thanks!

– Mike M.
Nov 23 '18 at 12:45





I could probably manage that. :-) I wasn't sure how much detail you wanted concerning the algorithms. Frankly, the strict one is a little mind numbing, and I've never bothered to fully digest it. Cool, gimme a minute to format. Thanks!

– Mike M.
Nov 23 '18 at 12:45












1 Answer
1






active

oldest

votes


















1















How is it checking a resource to determine which algorithm to use




It calls getResources().getBoolean() on the Context parameter to retrieve a bool resource that will have been set by the carrier; namely:



com.android.internal.R.bool.config_use_strict_phone_number_comparation


Just to note, the compare(String a, String b) method automatically uses the loose method.




how do the algorithms differ?




Both are rather involved, and tedious, but the main difference is that the loose algorithm is basically doing blind character comparisons, right to left, accounting pretty much only for formatting differences. This is usually more than sufficient for domestic calls.



The strict algorithm, however, takes into account all sorts of minute rules for international numbers and their varying acceptable differences; e.g., as commented in the source, "090-1234-1234 must not be equal to 90-1234-1234 in Japan".



These algorithms are (currently) in the methods named compareLoosely() and compareStrictly() in the source code for PhoneNumberUtils. I've not linked directly to the line numbers, as that's the master branch, and they're sure to change eventually.



Essentially, if you're relatively certain that you'll be dealing only with domestic numbers, the loose method is probably fine. If you're going to be handling international numbers, use the strict method.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53446070%2fwhat-do-strict-or-loose-comparisons-mean-for-phonenumberutils-compare%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1















    How is it checking a resource to determine which algorithm to use




    It calls getResources().getBoolean() on the Context parameter to retrieve a bool resource that will have been set by the carrier; namely:



    com.android.internal.R.bool.config_use_strict_phone_number_comparation


    Just to note, the compare(String a, String b) method automatically uses the loose method.




    how do the algorithms differ?




    Both are rather involved, and tedious, but the main difference is that the loose algorithm is basically doing blind character comparisons, right to left, accounting pretty much only for formatting differences. This is usually more than sufficient for domestic calls.



    The strict algorithm, however, takes into account all sorts of minute rules for international numbers and their varying acceptable differences; e.g., as commented in the source, "090-1234-1234 must not be equal to 90-1234-1234 in Japan".



    These algorithms are (currently) in the methods named compareLoosely() and compareStrictly() in the source code for PhoneNumberUtils. I've not linked directly to the line numbers, as that's the master branch, and they're sure to change eventually.



    Essentially, if you're relatively certain that you'll be dealing only with domestic numbers, the loose method is probably fine. If you're going to be handling international numbers, use the strict method.






    share|improve this answer




























      1















      How is it checking a resource to determine which algorithm to use




      It calls getResources().getBoolean() on the Context parameter to retrieve a bool resource that will have been set by the carrier; namely:



      com.android.internal.R.bool.config_use_strict_phone_number_comparation


      Just to note, the compare(String a, String b) method automatically uses the loose method.




      how do the algorithms differ?




      Both are rather involved, and tedious, but the main difference is that the loose algorithm is basically doing blind character comparisons, right to left, accounting pretty much only for formatting differences. This is usually more than sufficient for domestic calls.



      The strict algorithm, however, takes into account all sorts of minute rules for international numbers and their varying acceptable differences; e.g., as commented in the source, "090-1234-1234 must not be equal to 90-1234-1234 in Japan".



      These algorithms are (currently) in the methods named compareLoosely() and compareStrictly() in the source code for PhoneNumberUtils. I've not linked directly to the line numbers, as that's the master branch, and they're sure to change eventually.



      Essentially, if you're relatively certain that you'll be dealing only with domestic numbers, the loose method is probably fine. If you're going to be handling international numbers, use the strict method.






      share|improve this answer


























        1












        1








        1








        How is it checking a resource to determine which algorithm to use




        It calls getResources().getBoolean() on the Context parameter to retrieve a bool resource that will have been set by the carrier; namely:



        com.android.internal.R.bool.config_use_strict_phone_number_comparation


        Just to note, the compare(String a, String b) method automatically uses the loose method.




        how do the algorithms differ?




        Both are rather involved, and tedious, but the main difference is that the loose algorithm is basically doing blind character comparisons, right to left, accounting pretty much only for formatting differences. This is usually more than sufficient for domestic calls.



        The strict algorithm, however, takes into account all sorts of minute rules for international numbers and their varying acceptable differences; e.g., as commented in the source, "090-1234-1234 must not be equal to 90-1234-1234 in Japan".



        These algorithms are (currently) in the methods named compareLoosely() and compareStrictly() in the source code for PhoneNumberUtils. I've not linked directly to the line numbers, as that's the master branch, and they're sure to change eventually.



        Essentially, if you're relatively certain that you'll be dealing only with domestic numbers, the loose method is probably fine. If you're going to be handling international numbers, use the strict method.






        share|improve this answer














        How is it checking a resource to determine which algorithm to use




        It calls getResources().getBoolean() on the Context parameter to retrieve a bool resource that will have been set by the carrier; namely:



        com.android.internal.R.bool.config_use_strict_phone_number_comparation


        Just to note, the compare(String a, String b) method automatically uses the loose method.




        how do the algorithms differ?




        Both are rather involved, and tedious, but the main difference is that the loose algorithm is basically doing blind character comparisons, right to left, accounting pretty much only for formatting differences. This is usually more than sufficient for domestic calls.



        The strict algorithm, however, takes into account all sorts of minute rules for international numbers and their varying acceptable differences; e.g., as commented in the source, "090-1234-1234 must not be equal to 90-1234-1234 in Japan".



        These algorithms are (currently) in the methods named compareLoosely() and compareStrictly() in the source code for PhoneNumberUtils. I've not linked directly to the line numbers, as that's the master branch, and they're sure to change eventually.



        Essentially, if you're relatively certain that you'll be dealing only with domestic numbers, the loose method is probably fine. If you're going to be handling international numbers, use the strict method.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 23 '18 at 13:24









        Mike M.Mike M.

        29.7k66174




        29.7k66174






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53446070%2fwhat-do-strict-or-loose-comparisons-mean-for-phonenumberutils-compare%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            404 Error Contact Form 7 ajax form submitting

            How to know if a Active Directory user can login interactively

            TypeError: fit_transform() missing 1 required positional argument: 'X'