JavaScript – stringhe e numeri – 1

E se invece di Python lo script lo faccio con Node.js? Continuo da qui.

OK, letta una riga come stringa come raccontato nel post precedente voglio ricavare i numeri che la compongono. In JavaScript c’è la funzione split(), quella che mi serve, verifico:

* conv $ node
> st = '1 2 3.1415 4 5'
'1 2 3.1415 4 5'
> st.split(' ')
[ '1', '2', '3.1415', '4', '5' ]

sembra OK ma

> st = ' 1   2\t   3.1415 \t\t   4  \t5 '
' 1   2\t   3.1415 \t\t   4  \t5 '
> console.log(st)
 1   2	   3.1415 		   4  	5
undefined
> st.split(' ')
[ '',
  '1',
  '',
  '',
  '2\t',
  '',
  '',
  '3.1415',
  '\t\t',
  '',
  '',
  '4',
  '',
  '\t5',
  '' ]
> st.split(' \t')
[ ' 1   2\t   3.1415', '\t   4 ', '5 ' ]
> st.split('\t')
[ ' 1   2', '   3.1415 ', '', '   4  ', '5 ' ]

no; crea stringhe vuote e non toglie i tabs (\t).

Quando il gioco si fa duro s’invocano le regexs 💥 😁

> st
' 1   2\t   3.1415 \t\t   4  \t5 '
> st.match(/[^ \t]+/g)
[ '1', '2', '3.1415', '4', '5' ]

OK! è lei 🤩

Ci sono tante funzioni che convertono la stringa in numero. Mi riferisco agli interi ma salvo casi particolari vale tutto anche per i floating.

> sti = '123'
'123'
> +sti
123
> 1 * sti
123
> sti / 1
123
> sti - 0
123

ma attenzione:

> sti + 0
'1230'
> 0 + sti
'0123'

e poi ci sono stringhe malfatte

> stierr = '123a'
'123a'
> stierr * 1
NaN

Ci sono parseInt() e parseFloat() come nel C (quasi):

> sti = '123'
'123'
> parseInt(sti)
123
> parseInt(sti, 16)
291
> parseInt(sti, 8)
83
> stierr = '123z'
'123z'
> parseInt(stierr)
123
> parseInt(stierr, 16)
291
> parseInt(stierr, 8)
83
> parseInt(stierr, 2)
1

Niente errore, interrompe la valutazione della stringa appena trova un carattere non rappresentante una cifra.

Le stringhe possono essere in formato scientifico, (non con parseInt())

> '12e3' * 1
12000
> '12e-3' * 1
0.012
> '12E3' * 1
12000
> '4.2e1'
'4.2e1'
> '4.2e1' * 1
42
> '4.2e-1' * 1
0.42
> parseInt('56e3')
56
> // errore qui ^
undefined
> parseFloat('5.6e3')
5600

Esiste anche la funzione generica Number() che accetta per gli interi il formato esadecimale ma non l’ottale (d’altronde chi lo usa ancora nel 2018?)

> Number('12')
12
> Number('12.5')
12.5
> Number('12.5z')
NaN
> Number('0x12.5')
NaN
> Number('0x12')
18
> Number('012')
12
> Number('12e3')
12000
> Number('12.3e2')
1230

Quindi? Per me è importante che gli errori vengano segnalati, quindi niente parseX(). Per base 10 mi sa che Number() è OK altrimenti (a malincuore) la moltiplicazione per uno o la sottrazione di zero.

Uh! ht @ E&G 🤩

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: