Intl.NumberFormat è rotto!

8 views
Skip to first unread message

Mario Alexandro Santini

unread,
Feb 12, 2025, 8:34:45 AMFeb 12
to socr...@googlegroups.com
Ciao,

a coloro di voi che lavorano con JavaScript e che magari utilizzano l'API in oggetto per formattare numeri, sappiate che presto potreste avere dei problemi in alcuni casi.

Pare che il CLDR che standardizza i Locale per la formattazione abbia cambiato, per l'italiano, il numero minimo di cifre raggruppabili da 3 a 2.

La modifica pare sia avvenuta dietro richiesta dell'esperto linguistico e una volta approvata è uscita con la versione 46 che presto ci ritroveremo.

Io l'ho incontrata con la versione 23 di Nodejs.

Il problema è che le migliaia non sono più formattate.

1000 -> 1000 e non 1.000

Non c'è modo di sovrascrivere questo comportamento.



Mario

Guido Brugnara

unread,
Feb 16, 2025, 2:00:25 AMFeb 16
to socr...@googlegroups.com


Il 12/02/25 14:34, Mario Alexandro Santini ha scritto:
Ciao,

a coloro di voi che lavorano con JavaScript e che magari utilizzano l'API in oggetto per formattare numeri, sappiate che presto potreste avere dei problemi in alcuni casi.

Pare che il CLDR che standardizza i Locale per la formattazione abbia cambiato, per l'italiano, il numero minimo di cifre raggruppabili da 3 a 2.

Non comprendo "cambiato, per l'italiano, il numero minimo di cifre raggruppabili da 3 a 2."

Nell'esempio che riporti di cifre ne abbiamo 4.

grazie
Guido



La modifica pare sia avvenuta dietro richiesta dell'esperto linguistico e una volta approvata è uscita con la versione 46 che presto ci ritroveremo.

Io l'ho incontrata con la versione 23 di Nodejs.

Il problema è che le migliaia non sono più formattate.

1000 -> 1000 e non 1.000

Non c'è modo di sovrascrivere questo comportamento.



Mario
--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "Socraten" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a socraten+u...@googlegroups.com.
Per visualizzare questa discussione, visita https://groups.google.com/d/msgid/socraten/CAMUoZeesXnK%3DDZp7DbM4dy853oZZW6i40G7KEAg-DzhCnaPZfw%40mail.gmail.com.

Mario Alexandro Santini

unread,
Feb 16, 2025, 2:32:26 AMFeb 16
to socr...@googlegroups.com

On 2/16/25 08:00, 'Guido Brugnara' via Socraten wrote:
>
> Non comprendo "cambiato, per l'italiano, il numero minimo di cifre
> raggruppabili da 3 a 2."
>
> Nell'esempio che riporti di cifre ne abbiamo 4.
>

Ciao,

Non sono sicuro di aver capito perfettamente il senso di questa
variabile, quindi mi scuso se non sono in grado di spiegarlo in maniera
chiara.

Lo standard prevede una variabile che dice quale sia il numero minimo di
cifre per cui si effettua il ragruppamento nella formattazione.

Lo scopo di questa variabile è dato dal fatto che a seconda del contesto
linguistico le cifre possono essere ragruppate in maniera differente.

La modifica del valore per l'italiano comporta che il ragruppamento
parte solo dalle decine di migliaia in su.

Esempio:

Prima

1.000,00

10.000,00

100.000,00

1.000.000,00

Dopo

1000,00

10.000,00

100.000,00

1.000.000,00


Questo perché l'esperto linguista italiano ha detto che non è
obbligatorio ragruppare i numeri delle migliaia.


La mia osservazione è che la modifica ora renda "obbligatorio" non
farlo, dato che non c'è nessun modo per sovrascrivere questo
comportamento, se nonscegliendo un altro Locale.



> grazie
> Guido
>

Mario

Guido Brugnara

unread,
Feb 16, 2025, 3:19:18 AMFeb 16
to socr...@googlegroups.com
Quindi verrebbe da dire che quella variabile precedentemente impostata a
3 venga impostata a 4 così da determinare che finché il numero intero ha
non più di 4 cifre non vada raggruppato.

Immagino si sia una seconda variabile che stabilisca in numero ci cifre
da raggruppare, pari a 3.

Quando cici "l'esperto linguista italiano" intendi qualcuno che ha messo
in evidenza il cambiamento dettato da qualche organismo come l'Accademia
della Crusca o dell'Opera del Vocabolario Italiano del CNR?

Ciao
Guido

Il 16/02/25 08:32, Mario Alexandro Santini ha scritto:

Guido Brugnara

unread,
Feb 16, 2025, 3:41:50 AMFeb 16
to socr...@googlegroups.com
A quanto pare il come separare le migliaia è un ginepraio, vedi ad
esempio
https://it.wikipedia.org/wiki/Wikipedia:Bar/Discussioni/Separatore_delle_migliaia

Se ci appelliamo al sistema internazionale di unità di misura (come
dettato da'UE e recepito in Italia) andrebbe usato lo spazio breve come
separatore delle migliaia e la virgola per i decimali (anche per gli
anglosassoni ;-) ).

Temo che ci vorrà parecchio tempo per arrivare ad una prassi uniforme.

Ciao
Guido


Il 16/02/25 09:19, 'Guido Brugnara' via Socraten ha scritto:

tia...@gmail.com

unread,
Feb 17, 2025, 4:21:39 AMFeb 17
to Socraten
Ciao,

> Non c'è modo di sovrascrivere questo comportamento.

C'è `useGrouping: "always"` che fa quello che vogliamo:

new Intl.NumberFormat("it", { useGrouping: "always" }).format(1000)
-> 1.000

Pare che il nuovo default per l'italiano sia `useGrouping: "min2"`.

- Matthias

Mario Alexandro Santini

unread,
Feb 17, 2025, 4:29:37 AMFeb 17
to socr...@googlegroups.com


On Mon, Feb 17, 2025 at 10:21 AM tia...@gmail.com <tia...@gmail.com> wrote:
Ciao,

Ciao Matthias,
 
C'è `useGrouping: "always"` che fa quello che vogliamo:

new Intl.NumberFormat("it", { useGrouping: "always" }).format(1000)
-> 1.000

Ho appena provato, ma con node 23.7 non funziona.

±|master ✗|→ node
Welcome to Node.js v23.7.0.
 let formatter = new Intl.NumberFormat("it-IT",{  minimumFractionDigits:0,    maximumFractionDigits:1,    maximumSignificantDigits: 3, useGroupping: 'always' });
NumberFormat [Intl.NumberFormat] {}
> formatter.format(1000)
'1000'
>  formatter = new Intl.NumberFormat("it-IT",{ useGroupping: 'always' });
NumberFormat [Intl.NumberFormat] {}
> formatter.format(1000)
'1000'
>  formatter = new Intl.NumberFormat("it",{ useGroupping: 'always' });
NumberFormat [Intl.NumberFormat] {}
> formatter.format(1000)
'1000'


Pare che il nuovo default per l'italiano sia `useGrouping: "min2"`.


Sì, hai ragione.
 
- Matthias

Mario 

tia...@gmail.com

unread,
Feb 17, 2025, 4:54:07 AMFeb 17
to Socraten
Secondo MDN dovrebbe funzionare. C'è anche `true` (oppure 'true' come stringa?) che dovrebbe fare la stessa cosa.

Attenzione che hai un typo. Hai scritto "useGroupping" con due "p".

- Matthias

Mario Alexandro Santini

unread,
Feb 17, 2025, 5:06:07 AMFeb 17
to socr...@googlegroups.com
On Mon, Feb 17, 2025 at 10:54 AM tia...@gmail.com <tia...@gmail.com> wrote:
Secondo MDN dovrebbe funzionare. C'è anche `true` (oppure 'true' come stringa?) che dovrebbe fare la stessa cosa.

Attenzione che hai un typo. Hai scritto "useGroupping" con due "p".


Hai ragione!
Scritto bene funziona. :)

>  formatter = new Intl.NumberFormat("it-IT",{  minimumFractionDigits:0,    maximumFractionDigits:1,    maximumSignificantDigits: 3, useGrouping: 'always' });
NumberFormat [Intl.NumberFormat] {}
> formatter.format(1000)
'1.000'

Grazie!
La risposta che ho ricevuto da Nodejs era un link ad un ticket aperto sullo standard, dove dicevano che non c'era modo di sovrascrivere quel default!

E poi guardando nello standard mi sono perso e ci ho capito poco, francamente.
Così mi sono scoraggiato.

In effetti leggere la documentazione su MDN è meglio! :)
 
- Matthias


Mario
Reply all
Reply to author
Forward
0 new messages