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

Is there any real need for the "create a formatter" mechanism? #42

Closed
borgar opened this issue Jun 12, 2023 · 0 comments · Fixed by #47
Closed

Is there any real need for the "create a formatter" mechanism? #42

borgar opened this issue Jun 12, 2023 · 0 comments · Fixed by #47

Comments

@borgar
Copy link
Owner

borgar commented Jun 12, 2023

The interface was originally designed around use with libraries such as D3 where you could do:

const formatter = numfmt("#,##0");

const axis = d3
  .axisLeft(scale)
  .tickFormat(formatter);

But there seems little benefit to it over doing this:

const formatter = value => numfmt("#,##0", value);

const axis = d3
  .axisLeft(scale)
  .tickFormat(formatter);

On the other hand, the formatters require (minuscule, but still) more thought to understand. The returned functions with attachments are also harder to document, and type.

From running some basic benchmarks it looks like there isn't much of a speed gain to the system either. It looks like some better placed caching would likely bridge the little gap there is.

borgar added a commit that referenced this issue May 16, 2024
Dramatic overhaul of the parser and interface inspired by #42, the need to expose types (#38), and locale issues (#23).

### Changes from 2.0:

- Formatters are no longer constructed. Formatting is just a simple call. 
   Fixes: #42

- Types are now exposed for the entire interface.
  Closes #38

- _nbsp_ option is now off by default. A non-breaking space is till used as the grouping separator in the default locale, so "13 203" should not linebreak.

- `formatColor()` now returns `null` if pattern does not define a color. Previously it would default to "black".
   Fixes #40

- _locale_ has been fixed so that a pattern may correctly override a locale. The expected behaviour is to be able to provide a default locale and that formatters override it by modifiers.

- Both _en_US_ and _en-US_ styles are now supported for locale tags.

- Group sizing is now controlled by an option, `{ grouping: [ 3, 3 ] }`
  The formatter had remnants of behaviour from [its ancestor](https://github.com/borgar/ldml-number) which allowed defining group sizing in the format. In Excel, `#,##,##0` and `#,##0` are equivalent but sizing is controlled via locale settings.
  Fixes #48

- `dateToSerial()` no longer passes non-dates through. If it gets incompatible input (such as a number), a `null` will be returned.

- _nativeDate_ option has been removed. This affects two things:
  - `dateFromSerial()` now always returns a date parts array (`[ y, m, d, ... ]`).
  - `parseValue()`/`parseDate()` can no longer return dates.

  If you need the old behaviour then here is a utility function that safely converts the output to a `Date`. 

  ```js
  function toNativeDate (dateArrray) {
    const [ y, m, d, hh, mm, ss ] = dateArrray;
    const dt = new Date(0);
    dt.setUTCFullYear(y, m - 1, d);
    dt.setUTCHours(hh, mm, ss);
    return dt;
  }
  ```
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

Successfully merging a pull request may close this issue.

1 participant