Hi Tim, > I don't see a change made, so perhaps I was unclear in what I said. What I > meant was: Please add a full stub example including all the interfaces, > properties, and methods. It's currently split across multiple code blocks and > the interfaces are missing entirely. > > Example: > > final readonly class Number implements \Stringable { > public string $value; > // Further properties omitted for brevity. > > public function add(Number|string|int $num): Number {} > // Further methods omitted for brevity. > }
Ah I see. I misunderstood. I will add it when the discussion is settled. >>> - I don't want to expand the scope of your RFC further than necessary, but >>> for the rounding mode, I wonder if we should first add the RoundingMode >>> enum that has been suggested during the discussion of the "Add 4 new >>> rounding modes to round() function" RFC. It would make the type for the >>> `Number::$roundMode` property much clearer than the current `int`. I expect >>> the addition of such an enum to be a pretty simple RFC that would not need >>> much discussion. I'd be happy to co-author it. >> Oh, that's a good idea. Makes sense. I think it would be simpler to prepare >> an RFC separate from this RFC, so I'm going to create one right away. Once >> you have a certain amount of content, I would be happy if you could check it >> out and make corrections if necessary. > > Sure, just send me an email and I'm happy to look over it before you put it > up for discussion. Thanks! >>> - For `format()`, I'm not sure whether we should actually add the function. >>> While we have number_format() for regular numbers with the same signature, >>> it fails to account for the different language and cultures in the world. >>> Specifically `number_format()` cannot correctly format numbers for en_IN >>> (i.e. English in India). In India numbers are not separated every three >>> digits, but rather the three right-most digits and then every two digits. >>> Here's in example: 1,23,45,67,890. I believe formatting should be best left >>> for ext/intl. >> I'm not very familiar with ext/intl, but is there a way to format a string >> type number without converting it to a float? > > It appears the underlying icu4c library supports formatting numeric strings, > yes: > > https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/classicu_1_1NumberFormat.html#a8ed2ca7b9a65bf08c4ef81bbf9680f0d What I meant was that there is currently no such function in PHP. Do you think I should propose adding it to this RFC? >>> - I'm not sure if the priority for the rounding modes is sound. My gut >>> feeling is that operations on numbers with different rounding modes should >>> be disallowed or made explicit during the operation (much like the scale >>> for a division), but I'm not an expert in designing numeric APIs, so I >>> might be wrong here. >> As mentioned in the RFC, the problem here is commutative calculations (add, >> sub, mul). This means that even if specify `$roundingMode` during these >> calculations, `$roundingMode` will not be used in these calculations. >> Calculations that use `$roundingMode` are divs, etc. If allow >> `$roundingMode` to be specified with add, intuitively it feels like the >> result of add will be rounded. >> Also, it is not possible to specify `$roundMode` in calculations using >> operators. >> However, if the user calculates two numbers with different rounding modes, >> and it is intentional rather than a mistake, I can't imagine what kind of >> result the user would want to get. Therefore, it may be better to make this >> an error. >> Is it appropriate to throw a value error in that case? > > I think making this an error would be appropriate. Generally speaking: > Removing errors later is always possible if we find out that an operation is > safe and well-defined. Adding an error if we find out that an operation is > unsafe will result in breaking changes, thus we should get it right on the > first try. I agree, but if we adopt Rowan's suggestion this issue will go away, so if the issue is still there when things calm down I'll add the error. Regards. Saki