Hi

On 2/8/25 20:52, Eugene Sidelnyk wrote:
Maybe there could be another good feature to start with - the function to
format bytes into a human-readable format (for debug purpuses) to have
pretty view of the size (like 1.5GB, or 20MB)

[…]

This is too little thing for having separate composer library, and perhaps
having it built-in would be better?

On a surface level such a function would appear to be very simple, but the “human-readable format” bit alone already raises multiple questions, with the most notable one being: What is human-readable?

There's different languages in the world and they all use different decimal separators and group digits differently. And they possibly have different rules with regard to whether or not a space is required between the scalar part and the unit. In fact your example already is *incorrect* English, because English requires a space between the scalar part and the unit. And it should ideally be a non-breaking space.

So in English it would be:

- 1.5 GB
- 20 MB

In German we use the comma as the decimal separator (and also a space before the unit), so it would need to be:

- 1,5 GB
- 20 MB

Then there's also the question of whether to use the binary scale or the decimal scale. In other words: Should 1460 Bytes be rendered as 1.5 kB or as 1.4 KiB?

Also: How many decimal digits should be printed? Should it even be a fixed number of decimal digits, or are we rather interested in a total number of significant digits? In more explicit terms:

For 2 *decimal* digits:

1234 Bytes   -> 1.23 kB
12345 Bytes  -> 12.35 kB
123456 Bytes -> 123.46 kB

For 3 *significant* digits:

1234 Bytes   -> 1.23 kB
12345 Bytes  -> 12.3 kB
123456 Bytes -> 123 kB

Then there's the question of when the next unit should be used. Should the cut-off point be “there needs to be a 1 in front of the decimal point”? In some cases printing 0.9 GB might be preferable to 900 MB.

I could probably go on and find further questions, but I believe this already showcases how the devil is in the details - as with many RFCs that look great on a surface level.

In this specific case of usefully formatting numbers, I can recommend taking a look at the NumberFormatter class of ext/intl (https://www.php.net/manual/en/class.numberformatter.php). The API is not particularly pretty, but it handles the complex details of “correctly formatting a float according to language rules”. AFAICT you would still need to append the correct unit (and divide the number of bytes) yourself, though.

Best regards
Tim Düsterhus

Reply via email to