sheetjs icon indicating copy to clipboard operation
sheetjs copied to clipboard

Conditional format unexpected turn negative number to positive

Open Raccoonwao opened this issue 5 years ago • 6 comments

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

Raccoonwao avatar Oct 08 '20 03:10 Raccoonwao

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

Raccoonwao avatar Oct 08 '20 03:10 Raccoonwao

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?

SheetJSDev avatar Oct 08 '20 03:10 SheetJSDev

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

snoopyjc avatar Oct 08 '20 04:10 snoopyjc

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"/>

SheetJSDev avatar Oct 08 '20 07:10 SheetJSDev

Thanks! I will fix it and add more test cases.

-joe Sent from my AT&T iPhone

On Oct 8, 2020, at 3:26 AM, SheetJSDev [email protected] wrote:

 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"/>

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

snoopyjc avatar Oct 08 '20 16:10 snoopyjc

Any update for the fix?

Raccoonwao avatar Oct 04 '21 07:10 Raccoonwao