Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conditional format unexpected turn negative number to positive #2594

Open
Raccoonwao opened this issue Oct 8, 2020 · 6 comments
Open

Conditional format unexpected turn negative number to positive #2594

Raccoonwao opened this issue Oct 8, 2020 · 6 comments

Comments

@Raccoonwao
Copy link

Negative number is wrongly formatted to positive number in a condition format

Format: [>=1000000]#,,\" M\";####.00
Value: -12.3

Actual: 12.3
Expected: -12.3

Sample Program

console.log(`${value} => ${X.SSF.format([>=1000000]#,," M";####.00, -12.3)}\t\t format: ${format}``)

Seems negative value is A) converted to positive at https://github.com/SheetJS/sheetjs/blob/master/xlsx.js#L1012 but B) not converted back at https://github.com/SheetJS/sheetjs/blob/master/xlsx.js#L1062

The latter expects a format of 'n?' which I don't quite understand

@SheetJSDev SheetJSDev transferred this issue from SheetJS/sheetjs Oct 8, 2020
@Raccoonwao
Copy link
Author

Raccoonwao commented Oct 8, 2020

General works though
[>=1000000]#,,\" M\";####.00 => 12.3 \\ wrong
[>=1000000]#,,\" M\";General => -12.3 \\ correct

@SheetJSDev
Copy link
Contributor

The format has 2 parts. Normally, without a conditional, the second part handles negative values. As an example, using the format 0;0, -1 is actually rendered as "1" (no negative sign).

The conditionals are actually weird here and need a rethink. In specific, suppose the value is -2. Using the format [>=-1]0;0 Excel prints "2", but using the format [>=1]0;0 Excel prints "-2".

@snoopyjc any thoughts?

@snoopyjc
Copy link
Contributor

snoopyjc commented Oct 8, 2020

Yes this is a very complex area of Excel. I have this working in my python version:

>>> from ssf import SSF
>>> ssf = SSF()
>>> ssf.format('[>=1000000]#,,\" M\";####.00', -12.3)
'-12.30'
>>> ssf.format('[>=1000000]#,,\" M\";General', -12.3)
'-12.3'

@SheetJSDev If you want to back-port it to JS, look at the last block of code in _check_fmt() around line 2989, plus the new _negcond() routine, and check where I call it in the '[' match part of _eval_fmt(), around line 2413.

https://github.com/snoopyjc/ssf/blob/master/ssf/ssf.py

@SheetJSDev
Copy link
Contributor

Same problem:

>>> ssf.format('[>=-1]0;0', -2)
'-2'

According to Excel 2019 for Mac and Excel 2019 for Windows, using the format [>=-1]0;0, -2 is rendered as "2" (no negative sign)

There's no UI chicanery, as an XLSX file with the format has the following representation in the XML:

    <numFmt numFmtId="170" formatCode="[>=-1]0;0"/>

@snoopyjc
Copy link
Contributor

snoopyjc commented Oct 8, 2020 via email

@Raccoonwao
Copy link
Author

Any update for the fix?

@reviewher reviewher transferred this issue from SheetJS/ssf Mar 9, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants