2010-12-01 7 views
41

Ich habe eine Liste von Preisen mit einem Komma für einen Dezimalpunkt und einen Punkt als Tausendertrennzeichen.Konvertieren einer Zahl mit Komma als Dezimalpunkt zu float

Einige Beispiele:

12,30
116,10
1.563,14

Diese von einem Dritten in diesem Format kommen. Ich möchte sie in Floats umwandeln und sie zusammenfügen.

Was ist der beste Weg, dies zu tun? number_format scheint nicht mit diesem Format zu arbeiten, und str_replace scheint wie Overkill, wie ich es mehr als einmal auf jeder Zahl tun muss.

Gibt es einen besseren Weg? Vielen Dank.

+0

können Sie die Punkte ausdrücken, dann tauschen Sie das Komma für den Punkt und analysieren als float. Das sind nur 2 ersetzt.Das ist nicht -terrible- es sei denn, Sie tun Zehntausende von Aufnahmen bei einer Aufnahme – DampeS8N

Antwort

78

Verwenden str_replace() zum Entfernen der Punkte ist nicht übertrieben.

$string_number = '1.512.523,55'; 
// NOTE: You don't really have to use floatval() here, it's just to prove that it's a legitimate float value. 
$number = floatval(str_replace(',', '.', str_replace('.', '', $string_number))); 

// At this point, $number is a "natural" float. 
print $number; 
 

Dies ist fast sicher die am wenigsten CPU-intensive Art und Weise, dies zu tun, und Chancen sind, dass selbst wenn Sie einige ausgefallene Funktion verwenden, es zu tun, dass das ist, was es unter der Haube hat.

+0

'floatval' war der Schlüssel hier ... thx –

+1

oder nur' $ number = str_replace ([',', '.'], ['.'], $ Zeichenkette) * 1.0; ' – Jeff

14

Wenn Sie PHP5.3 oder höher verwenden, können Sie numfmt_parse "reversed number_format" verwenden. Wenn Sie es nicht sind, haben Sie die Vorkommen mit preg_replace/str_replace ersetzt.

+1

Sie brauchen auch PECL intl> = 1.0.0 – riotera

+1

"Sie brauchen auch PECL intl> = 1.0.0" Nein, es heißt Sie entweder muss PHP 5.3> oder Sie müssen es über PECL Intl-Paket 1.0.0 installieren. PHP 5.3+ hat die Unterstützung eingebaut. –

+0

Sie müssen tatsächlich überprüfen, ob die 'intl'-Erweiterung aktiviert ist. Es ist nicht eingebaut, es muss entweder explizit kompiliert oder als separate Erweiterung installiert sein. Nicht alle Hosting-Provider installieren es mit PHP. – cronfy

1

von PHP-Handbuch:

str_replace - Ersetzen Sie alle Vorkommen des Suchbegriffs mit dem Ersatz-String

ich diesen Weg gehen würde, und dann aus der Zeichenfolge konvertieren zu schweben - floatval

4

Unter der Annahme, sie in einer Datei oder einem Array sind nur ersetzen die als Batch (das heißt auf auf einmal):

$input = str_replace(array('.', ','), array('', '.'), $input); 

und dann die Zahlen verarbeiten von dort alle Vorteile von PHP lose typisierte Natur nehmen.

2

Diese Funktion ist kompatibel für Zahlen mit Punkten oder Kommas als Dezimalstellen

function floatvalue($val){ 
      $val = str_replace(",",".",$val); 
      $val = preg_replace('/\.(?=.*\.)/', '', $val); 
      return floatval($val); 
} 
$number = "1.325.125,54"; 
echo floatvalue($number); // The output is 1325125.54 
$number = "1,325,125.54"; 
echo floatvalue($number); // The output is 1325125.54 
0

übermäßigen aussehen könnte aber jedes gegebenes Format keine mater, das Gebietsschema konvertieren:

function normalizeDecimal($val, int $precision = 4): string 
{ 
    $input = str_replace(' ', '', $val); 
    $number = str_replace(',', '.', $input); 
    if (strpos($number, '.')) { 
     $groups = explode('.', str_replace(',', '.', $number)); 
     $lastGroup = array_pop($groups); 
     $number = implode('', $groups) . '.' . $lastGroup; 
    } 
    return bcadd($number, 0, $precision); 
} 

Ausgang:

.12   -> 0.1200 
123   -> 123.0000 
123.91  -> 12345678.9100 
123 456 78.91 -> 12345678.9100 
123,456,78.91 -> 12345678.9100 
123.456.78,91 -> 12345678.9100 
123 456 78,91 -> 12345678.9100 
Verwandte Themen