sharkdp / insect

High precision scientific calculator with support for physical units
https://numbat.dev/
MIT License
3.18k stars 126 forks source link

Support underscores as separators #385

Closed triallax closed 1 year ago

triallax commented 1 year ago

Commas as separators was discussed before, but they were ruled out because they cause ambiguity in function arguments (e.g. is f(1,2) equivalent to f(1, 2) or (f12)?). I think underscores are a suitable alternative instead. Supporting underscores in input is important for me, but supporting them in output too (possibly behind a toggle) would be also nice in my opinion, because it's difficult for me to count the zeros at a glance in e.g. 23000000.

sharkdp commented 1 year ago

Sounds great. C++ uses single quotes as a separator: 100'000, but I think I like Python-style underscores better. In Python, you are allowed to put those separators everywhere you want. You can write 230_0_0_000, if you desire. I was thinking if it would be beneficial to only allow the separators to appear in the "right" spots (1000-separators), as in 23_000_000?

triallax commented 1 year ago

C++ uses single quotes as a separator: 100'000, but I think I like Python-style underscores better.

I wouldn't mind single quotes too, especially since they don't require two keypresses to type as opposed to an underscore (Shift+- on my layout). This is layout-dependent though. Regardless, I think it would be nice to allow setting the separator from a predetermined list of allowed values (https://github.com/sharkdp/insect/issues/107).

In Python, you are allowed to put those separators everywhere you want. You can write 230_0_0_000, if you desire. I was thinking if it would be beneficial to only allow the separators to appear in the "right" spots (1000-separators), as in 23_000_000?

I can see the advantage of this (the user can know for sure that they didn't put underscores in the wrong places, or added or removed digits by accident), and it's also in line with Insect's philosophy of being strict rather than lax. However, I fear that this may preclude edge use cases (e.g. if somebody wants to separate by the 10 thousands instead of thousands), or negatively affect editing experience (e.g. if a user wants to change 2_123_450 to 2_123_45, they have to move the separators appropriately, which kind of sucks). I don't know how realistic those concerns are though, so some real usage may be warranted to gauge the impact of these and other issues.

The alternatives to this that come to my mind:

  1. Allow configuring whether separators should only separate by the thousands
  2. Allow a "consistent" number of digits between each separator (i.e. 2_0_0 and 2_0000_0000 are okay, but 2_00_0 is not)
  3. Just allow separators anywhere in a number
triallax commented 1 year ago

Also, I just thought of this idea that I think is awesome but admittedly somewhat unorthodox and possibly non-trivial: auto-insert underscores in the input. For instance, if I type 2000, Insect would automatically show an underscore after the 2, like 2_000.

sharkdp commented 1 year ago

This is now supported in Numbat, you can try it here: https://numbat.dev/?q=200_000