Phone numbers are usually all numbers that ignore parsers, dashes, pluses, etc., so the input fields for phone numbers are usually numeric.
When a screen reader encounters a numerical input field, it will read the value as an integer. For example, if I had three input fields for an American phone number, the first of which was an area code (3 digits), then an exchange (3 digits), then a string (4 digits), if the fields have 123, 456, 7890 (respectively) as we usually say, the numbers are "one two three," "four five six," "seven, eight, nine, zero."
But when the screen reader encounters these fields, he says βone hundred twenty three,β βfour hundred and fifty six,β βseven thousand eight hundred and ninety.β
I think that users on the screen of readers are used to hearing phone numbers as large numbers (at least the guys I spoke to expect this), but this does not mean that we can not do it better. If I asked one of these guys for their phone number, they would not use large numbers, but separate numbers.
I tried various input> types and looked through all the roles, states and properties, but did not see anything that could make the numbers read.
All I can think of is to encode around it, having a visually hidden <span> that contains a number as separate digits, <span id = 'foo'> 1 2 3 </span>, then having <aria- input labelledby = 'foo'>.
Is there a better way?