Bug 447347 - pasting numbers starting with zero are parsed as octal
Summary: pasting numbers starting with zero are parsed as octal
Status: RESOLVED FIXED
Alias: None
Product: kcalc
Classification: Applications
Component: general (show other bugs)
Version: 21.04.3
Platform: Fedora RPMs Linux
: NOR normal
Target Milestone: ---
Assignee: Gabriel Barrantes
URL:
Keywords:
: 375681 398849 (view as bug list)
Depends on:
Blocks:
 
Reported: 2021-12-21 16:41 UTC by Matteo Croce
Modified: 2024-01-26 09:50 UTC (History)
3 users (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Matteo Croce 2021-12-21 16:41:54 UTC
SUMMARY
When pasting numbers starting with a zero digit (e.g. "0300", "0FB00"), they are parsed as octal.

If the number is not valid octal, e.g. contains digits [8-9a-f], then "nan" is put in kcalc.


STEPS TO REPRODUCE
1. Open a text editor
2. copy the strings "0911", "012346" or "0600"
3. paste it in kcalc
Comment 1 Evan Teran 2022-01-13 17:13:25 UTC
Yeah, this is a long standing thing where there's two camps.

Some people people want the input data's apparent base to be respected. So pasting in `0x1234` will past in a hex value, even if you're in decimal mode

Some people want the input data's apparent base to be ignored in favor of the user's selected mode.

Unfortunately, I'm not sure there is a way to satisfy everyone on this one. But maybe we should lean towards the user's select mode :shrug:
Comment 2 Matteo Croce 2022-01-13 17:43:11 UTC
Yes, that's ok with the "0x" prefix, because 0x1234 is undoubtedly an hex value, but is very, very common to have hex or decimal numbers starting with 0.
Comment 3 Evan Teran 2022-01-13 21:24:40 UTC
Understood, unfortunately the convention for octal numbers is "starts with a 0". Admittedly, this is considered confusing to many, so much so that python added 0o1234 as an alternative octal prefix. Perhaps kcalc could thread this needle by accepting 0o as an octal prefix, 0x as a hex prefix, 0b as a binary prefix and otherwise, assume decimal.
Comment 4 Matteo Croce 2022-01-14 02:10:45 UTC
The problem is that the issue is very silet.
An user can paste "01234" in kcalc and the calculations will be wrong without noticing.
That's what happened to me, I pasted an hex offset, something like 00000123 and it was converted.
Comment 5 Gabriel Barrantes 2023-10-30 21:51:40 UTC
(In reply to Evan Teran from comment #3)
> Understood, unfortunately the convention for octal numbers is "starts with a
> 0". Admittedly, this is considered confusing to many, so much so that python
> added 0o1234 as an alternative octal prefix. Perhaps kcalc could thread this
> needle by accepting 0o as an octal prefix, 0x as a hex prefix, 0b as a
> binary prefix and otherwise, assume decimal.
Comment 6 Bug Janitor Service 2023-11-03 02:25:29 UTC
A possibly relevant merge request was started @ https://invent.kde.org/utilities/kcalc/-/merge_requests/67
Comment 7 Gabriel Barrantes 2023-11-09 01:51:12 UTC
*** Bug 398849 has been marked as a duplicate of this bug. ***
Comment 8 Gabriel Barrantes 2023-11-09 02:13:03 UTC
*** Bug 375681 has been marked as a duplicate of this bug. ***
Comment 9 Carl Schwan 2024-01-25 17:28:04 UTC
Git commit c7864e9547b2ef2e9e318a88c78ba51f10fbc5e3 by Carl Schwan, on behalf of Gabriel Barrantes.
Committed on 25/01/2024 at 18:27.
Pushed by carlschwan into branch 'master'.

Add display for user's input

Add display to keep the user's entries visible during the whole calculation process, this allows editing the expression at any point to make any correction the user considers opportune. This display allows coping/pasting an expression to be calculated, that can also be edited as required.

All currently implemented functions are supported and also was added support for 0x, 0b and 0 as prefixes for hex, binary and octal numbers.

Before:![image.png](/uploads/bfd53d4ddb462c995181547c24f3ecbc/image.png){width="225" height="211"}

After:

![image.png](/uploads/0b1e83cff41409c5d925e8014cf6f988/image.png){width="258" height="258"}![image.png](/uploads/e6cb88f4492ca0b98f9ebb08e669bc9f/image.png){width=262 height=262}

New classes added:

* KCalcToken: contains a given valid token such as an operation (+, -, ...), a function (cos, ln, ...), a parenthesis or a number.
* KCalcParser: provides an API to convert a given string (for example "1+cos(4.5)") to a Queue of KCalcToken objects.
* KCalcInputDisplay: this is a customized QLineEdit widget, it holds the user's input.
* KCalcDisplayFrame: holds the input display, result display and some labels.
* CalcEngine_p: encapsulates the functionality that used to be available in CalcEngine class, to be only visible for KCalcToken objects.

Modified classes:

* CalcEngine: added the main algorithm to process the calculation, based on common Operator-precedence parsers.

@teams/qa @teams/vdg @teams/usability
Related: bug 461010, bug 470371, bug 470591, bug 142728, bug 459999, bug 443276, bug 454835

M  +17   -1    CMakeLists.txt
A  +20   -0    autotests/CMakeLists.txt
A  +239  -0    autotests/kcalc_parser_core_test.cpp     [License: GPL(v2.0+)]
M  +352  -363  kcalc.cpp
M  +39   -19   kcalc.h
M  +600  -300  kcalc.ui
M  +1    -19   kcalc_const_menu.cpp
M  +2    -1    kcalc_const_menu.h
M  +411  -828  kcalc_core.cpp
M  +24   -107  kcalc_core.h
A  +713  -0    kcalc_core_p.cpp     [License: GPL(v2.0+)]
A  +92   -0    kcalc_core_p.h     [License: GPL(v2.0+)]
A  +57   -0    kcalc_display_frame.cpp     [License: GPL(v2.0+)]
A  +24   -0    kcalc_display_frame.h     [License: GPL(v2.0+)]
A  +101  -0    kcalc_input_display.cpp     [License: GPL(v2.0+)]
A  +36   -0    kcalc_input_display.h     [License: GPL(v2.0+)]
A  +776  -0    kcalc_parser.cpp     [License: GPL(v2.0+)]
A  +155  -0    kcalc_parser.h     [License: GPL(v2.0+)]
A  +64   -0    kcalc_priority_levels_p.h     [License: GPL(v2.0+)]
A  +412  -0    kcalc_token.cpp     [License: GPL(v2.0+)]
A  +175  -0    kcalc_token.h     [License: GPL(v2.0+)]
M  +3    -72   kcalcdisplay.cpp
M  +0    -1    kcalcdisplay.h
M  +1    -42   kcalchistory.cpp
M  +0    -3    kcalchistory.h
M  +9    -1    knumber/knumber.cpp
M  +2    -0    knumber/knumber.h
M  +4    -4    scienceconstants.xml

https://invent.kde.org/utilities/kcalc/-/commit/c7864e9547b2ef2e9e318a88c78ba51f10fbc5e3
Comment 10 Matteo Croce 2024-01-26 09:50:21 UTC
Hi,

where the cited attachments can be found?