Stringa PHP da fluttuare


120

Non ho affatto familiarità con PHP e ho avuto una domanda veloce.

Ho 2 variabili pricePerUnite InvoicedUnits. Ecco il codice che li imposta sui valori:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Se eseguo questo output, ottengo i valori corretti. Diciamo 5000unità fatturate e 1.00per prezzo.

Ora devo mostrare l'importo totale speso. Quando moltiplico questi due insieme non funziona (come previsto, queste sono stringhe).

Ma non ho idea di come analizzare / eseguire il cast / convertire le variabili in PHP.

Cosa dovrei fare?

Risposte:


202
$rootbeer = (float) $InvoicedUnits;

Dovrebbe farlo per te. Dai un'occhiata a Type-Juggling . Dovresti anche leggere Conversione di stringhe in numeri .


È il metodo più semplice .. ma occasionalmente mi sono imbattuto in problemi nel farlo con alcune configurazioni di database e VARCHAR>11in lunghezza .. non ho ancora ristretto esattamente il motivo.
Talvi Watia

2
^ Vale la pena notare che (float) rimuove 0 dalla stringa se è la prima cifra

Tieni inoltre presente che "11.000,00" produrrà 11 invece del previsto 11000,00
CodeJunkie

65

Si desidera che il non-locale-aware floatvalfunzione di :

float floatval (mixed $ var) - Ottiene il valore float di una stringa.

Esempio:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343

4
complimenti per aver menzionato la consapevolezza del locale. Ho appena speso 1,5 ore a rintracciare un problema causato da diverse impostazioni locali che hanno causato la (float)conversione sul primo server in "," e sul secondo in ","
Dr. Gianluigi Zane Zanettini

23

Bene, se l'utente scrive 1,00,000, floatvar mostrerà un errore. Così -

floatval(preg_replace("/[^-0-9\.]/","",$input));

Questo è molto più affidabile.

Utilizzo:

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));

7
Invece di ereg usa preg $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
Sì, ereg, questa funzione è stata DEPRECATA. Quindi è necessario utilizzare preg invece ereg :)
HADI

9

Gestire il markup in float è un compito non banale. Nella notazione inglese / americana formatti mille più 46*10-2:

1,000.46

Ma in Germania cambieresti virgola e punto:

1.000,46


Questo rende davvero difficile indovinare il numero giusto nelle applicazioni multilingue.
Suggerisco vivamente di utilizzare Zend_MeasureZend Framework per questa attività. Questo componente analizzerà la stringa in un float dalla lingua degli utenti.


3
Al giorno d'oggi (+3 anni), si potrebbe usare NumberFormatter a partire da PHP 5.3 con l' intlestensione.
Zamnuts

1
PHP 5.3 era disponibile quando ho risposto alla domanda, ma fino al tuo commento non ero a conoscenza di questa singola funzione poiché ci sono dozzine di librerie che fanno qualcosa di simile. Ma non avranno una copertura così buona delle località come ha l'estensione internazionale. Grazie, cercherò di ricordarmelo.
Tobias P.

1

Usa questa funzione per lanciare un valore float da qualsiasi tipo di stile di testo:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

Questa soluzione non dipende dalle impostazioni locali. Pertanto, per l'input dell'utente, gli utenti possono digitare valori float in qualsiasi modo desiderino. Questo è molto utile, ad esempio, quando hai un progetto che è solo in inglese ma persone in tutto il mondo lo stanno usando e potrebbero non avere in mente che il progetto vuole un punto invece di una virgola per i valori float. Potresti lanciare javascript nel mix e recuperare le impostazioni predefinite del browser, ma ancora molte persone impostano questi valori in inglese ma ancora digitando 1,25 invece di 1,25 (specialmente ma non limitato al settore della traduzione, ricerca e IT)


eventuali commenti sul motivo per cui questo è negativo / dove fallisce?
Hafenkranich

o c'è un modo altrettanto flessibile che è più veloce?
Hafenkranich

1
Utilizza il flag e, che "non è più supportato". Questa è la mia ipotesi.
Leif

0

Stavo riscontrando un problema con il modo standard per farlo:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

Se non c'è un numero valido, il parser non dovrebbe restituire un numero, dovrebbe generare un errore. (Questa è una condizione che sto cercando di catturare nel mio codice, YMMV)

Per risolvere questo problema ho fatto quanto segue:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

Quindi, prima di elaborare ulteriormente la conversione, posso controllare e restituire un errore se non c'era un'analisi valida della stringa.


0

Se devi gestire valori che non possono essere convertiti separatamente, puoi utilizzare questo metodo:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}

0

puoi seguire questo link per saperne di più su come convertire una stringa / numero in numero / float / decimale in PHP. ECCO COSA DICE QUESTO LINK ...

Metodo 1: utilizzo della funzione number_format (). La funzione number_format () viene utilizzata per convertire una stringa in un numero. Restituisce il numero formattato in caso di successo altrimenti restituisce E_WARNING in caso di fallimento.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Metodo 2: utilizzo del casting del tipo: Typecasting può convertire direttamente una stringa in un tipo primitivo float, double o integer. Questo è il modo migliore per convertire una stringa in un numero senza alcuna funzione.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Metodo 3: utilizzo della funzione intval () e floatval (). Le funzioni intval () e floatval () possono anche essere usate per convertire la stringa rispettivamente nei corrispondenti valori interi e float.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Metodo 4: aggiungendo 0 o eseguendo operazioni matematiche. Il numero di stringa può anche essere convertito in un numero intero o in virgola mobile aggiungendo 0 con la stringa. In PHP, eseguendo operazioni matematiche, la stringa viene convertita in un numero intero o float implicitamente.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.