With lines, instead of calculating U values by dividing @ptnum by @numpt, you could - at the very start of the process - add a float attribute (using Attribute Create), with the value set to @ptnum. Lines by default only have 2 points, so pt 0 will have a value of 0 and pt 1 will be set to 1.
You then could resample the lines once they've been copied onto points (eg for hairs), by minimum distance, so that they are divided more evenly. The U value will have been interpolated correctly.