It is generally believed that you can control numbers users are permitted to call only by limiting the permitted numbers in the Route. If you want to only permit local numbers to be dialed for a user, you create a route that only permits local numbers, then assign that route to a PSTN Usage and a Voice Policy. You then assign that Voice Policy to a user and they can now only call local numbers.
However, you can accomplish the same thing by using Dial Plans. If a user dials a number that is not able to be normalized, the Skype for Business client will drop that call before it ever gets to the Route.
Below is a video demonstrating how the Dial Plan prevents calls from happening. In the video, I create a new Dial Plan and Route. The Route retains the default “permit all” regular Expression of .* yet calls are still dropped because the Dial Plan prevents calls from being placed.
I do not recommend using Dial Plans to limit the range of numbers that users dial. Instead you should continue using Routes.
Routes offer more flexibility in that they can be used in multiple PSTN Usages in order to accomplish things such as Least Cost Routing.
Also, you can update a route and have it replicated throughout your environment in about 5 minutes. While it also takes about 5 minutes to replicate an updated Dial Plan, it won’t take effect until users restart their client. That could take days or weeks for some users. (Or you could migrate all of your users to a different pool and migrate them back. That will forces re-signing in.)
And as soder pointed out in the comments, a clever user could just place a call by manually adding a “+” before their dialed number. Any call submitted with a “+” skips the Dial Plan if that call comes in via a non-Lync/Skype for Business client (as Mickael B pointed out in the comments though my clarification here is still a bit dodgy). If the backend route is the default .*, then that user could place any call he wanted regardless of what the Dial Plan is limited to.