Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Variabile numerica vista come stringa

    Salve.

    Mi sono imbattuto in un problema da cui non riesco ad uscirne.

    Ho creato un codice che estrae dati da una pagina web. Il dato in questione è un prezzo, 18.80 €

    $num ha un valore di 18.80 €

    Se lo vado a stampare a video, tutto ok quindi:

    echo $num; -> 18.80 € // corretto

    andiamo a ripulirlo, quindi:

    $num2 = preg_replace('/[^0-9.]/','', $num);
    echo $num2; -> 18.80 // corretto

    Adesso viene il bello..

    se faccio

    echo (float)$num2; -> 0 // lo vede come zero
    echo (int)$num2; -> 0 // lo vede come zero
    echo floatval($num2); -> 0 // lo vede come zero
    echo intval($num2); -> 0 // lo vede come zero

    a questo punto forzo..

    verifico il tipo di variabile

    echo gettype($num2); -> mi restituisce 'string'

    quindi cambio il tipo di variabile

    settype($num2,'float');

    echo $num2; -> 0 // da sempre valore zero

    tento l'ultima assegnandolo ad una nuova variabile float


    $nuova = (float)$num2;
    echo $nuova; -> sempre 0

    mi viene un dubbio.. quindi faccio

    echo $num2; -> mi da 18.80

    subito dopo

    echo count($num2); -> mi da 1 (dovrebbe darmi 5)

    quindi capisco che questo "18.80" lo vede come un carattere unico e forse non riesce a decodificarlo (come ad esempio i caratteri speciali etc).

    Tuttavia è riuscito a ripulirlo con preg_replace() carattere per carattere, al che la cosa mi suona ancora più strana.

    Cosa mi consigliate di fare a questo punto? Io ho bisogno di avere questo numero come valore numerico e non come stringa, per inserirlo in una espressione matematica.

    Ha forse a che fare la codifica dei caratteri? E come posso risolvere in caso?

    Grazie anticipatamente!
    Ultima modifica di Fede_Rico; 25-03-2015 a 02:11

  2. #2
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Non ti devi spaventare, in php le operazioni di conversione e confronto sono più strane, complicate e imprevedibili di quanto dovrebbe essere.

    echo count($num2); -> mi da 1 (dovrebbe darmi 5)
    L'idea di contare i byte della stringa è buona, hai solo confuso count per strlen. Un modo ancora migliore per capire il problema è vedere cosa c'è realmente in $num2. Puoi controllare con
    Codice PHP:
    echo bin2hex($num2); // "18.80" -> 31382e3830 
    Dicci cosa ottieni tu e ti indicheremo la causa del problema. Se nella conversione ottieni uno zero significa che molto probabilmente $num2 non inizia con un numero, ma hai degli altri caratteri in quella stringa. Il fatto che il "glifo invisibile" non venga visualizzato quando lo stampi con echo non è influente e neanche tanto strano se pensi che quei dati arrivano da una pagina web con chissà quale codifica.
    Ultima modifica di .Kurt; 25-03-2015 a 02:58

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Basta fare $num2 = $num2 + 0; dopo la ripulitura. $num2 diventa "double".
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    Quote Originariamente inviata da .Kurt Visualizza il messaggio
    Non ti devi spaventare, in php le operazioni di conversione e confronto sono più strane, complicate e imprevedibili di quanto dovrebbe essere.


    L'idea di contare i byte della stringa è buona, hai solo confuso count per strlen. Un modo ancora migliore per capire il problema è vedere cosa c'è realmente in $num2. Puoi controllare con
    Codice PHP:
    echo bin2hex($num2); // "18.80" -> 31382e3830 
    Dicci cosa ottieni tu e ti indicheremo la causa del problema. Se nella conversione ottieni uno zero significa che molto probabilmente $num2 non inizia con un numero, ma hai degli altri caratteri in quella stringa. Il fatto che il "glifo invisibile" non venga visualizzato quando lo stampi con echo non è influente e neanche tanto strano se pensi che quei dati arrivano da una pagina web con chissà quale codifica.
    Ho provato bin2hex e mi restituisce, qualunque valore (prezzo) io gli passi, questo: 32352e3030

  5. #5
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Ho provato bin2hex e mi restituisce, qualunque valore (prezzo) io gli passi, questo: 32352e3030

    Non dovresti riscontrare problemi nella conversione. (25.00) Puoi fornire, in poche righe, una riproduzione dell'errore?

  6. #6
    a me il cast a float non restituisce 0 ma 18.80 correttamente
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    In effetti ripulendolo non riscontro grossi problemi però, devo dire che con str_replace() non riesco a sostituire le virgole con i punti, forse perchè non riesce a scomporre il valore originale.
    Ho convertito nuovamente in esadecimale con bin2hex() compreso il carattere € e mi da questo: e282ac2031352e303020

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.