In Latin seventeen is septendecim, and sixteen is sedecim (fifteen is quindecim). Language drift has shortened most French words from their Latin ancestors, and the same goes for the numbers for 10-20. I presume that the early French chose to use dix-sept when their words for septendecim and sedecim started to sound the same.
As for dix-huit and dix-neuf, the Romans counted down from twenty; duodeviginti (two-down-from-twenty) is eighteen and undeviginti (one-down-from-twenty).
So it probably made more sense to the early French to say dis-huit and dix-neuf instead.
But one interesting thing about French numbers that you have missed is that it possess a vestigial remnant of the vigesimal (base-20) number system of the Celtics, where 80 is quatre-vignts (four-twentys) to the French, and 90 is quatre-vignts-dix.
70 is sixty-ten (soixante-dix), then 71 is sixty-eleven... and so on, up to 99: four-twenty-nineteen. Indeed, 80 is 4 times 20, hence "four-twenty" (quatre-vingt, without the "s" at the end).
Interestingly enough, French-speaking Belgians use the regular forms: 70 is "septante", 80 is "octante", and 90 is "nonante".
Is that actually a vestige of a hexadec system, or just a strange quirk? Note that 2 sounds similar to 12, 3 to 13, and so on. That implies there's a relationship between those numbers, which only exists in decimal.