devansh173 opened a new issue, #44642:
URL: https://github.com/apache/superset/issues/44642

   ### Bug description
   
   Reports that send a chart as text format numbers on the server with 
`superset/utils/number_format.py`, which is meant to reproduce the frontend's 
d3-format output. For negative values that round to zero at the chosen 
precision, it keeps the minus sign, while d3-format (and so the chart in the 
browser) drops it.
   
   ```python
   >>> from superset.utils.number_format import format_number_with_config
   >>> format_number_with_config(",.2f", None, -0.001)
   '-0.00'
   >>> format_number_with_config("(,.2f", None, -0.001)
   '(0.00)'
   >>> format_number_with_config("$,.2f", None, -0.004)
   '-$0.00'
   >>> format_number_with_config(",d", None, -0.4)
   '-0'
   ```
   
   The same values rendered with d3-format 3.1.2 using Superset's locale 
(`minus: "-"`):
   
   | format | value | d3-format (browser) | `number_format.py` (report) |
   |---|---|---|---|
   | `,.2f` | -0.001 | `0.00` | `-0.00` |
   | `(,.2f` | -0.001 | `0.00` | `(0.00)` |
   | `$,.2f` | -0.004 | `$0.00` | `-$0.00` |
   | `.1%` | -0.0001 | `0.0%` | `-0.0%` |
   | `,d` | -0.4 | `0` | `-0` |
   | ` ,.2f` | -0.001 | ` 0.00` | `-0.00` |
   | `+,.2f` | -0.001 | `-0.00` | `-0.00` |
   
   d3-format has an explicit rule for this in `src/locale.js`:
   
   ```js
   // If a negative value rounds to zero after formatting, and no explicit 
positive sign is requested, hide the sign.
   if (valueNegative && +value === 0 && sign !== "+") valueNegative = false;
   ```
   
   `apply_sign` in `number_format.py` decides the sign from the raw value 
(`value < 0`) and does not have this rule, so the emailed/Slack table can show 
`-0.00` or `(0.00)` next to a chart that shows `0.00`. Small negative values 
like this are common for things like differences or rounding noise from 
aggregations.
   
   ### Expected behavior
   
   The report text matches the chart: a negative value that formats to zero is 
shown without a sign (`0.00`, `$0.00`, `0`), unless the `+` sign mode is used.
   
   ### Actual behavior
   
   The minus sign (or accounting parentheses) is kept: `-0.00`, `(0.00)`, 
`-$0.00`, `-0`.
   
   ### Suggested fix
   
   In `apply_sign`, treat the value as non-negative when the formatted 
magnitude has no non-zero digit and the sign mode is not `+`, like d3 does.
   
   ### Environment
   
   - Superset version: master
   - Python version: 3.11
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to