Ich habe eine Preisliste mit einem Komma für einen Dezimalpunkt und einem Punkt als Tausendertrennzeichen.
Einige Beispiele:
12,30
116,10
1,563,14
Diese kommen in diesem Format von Dritten. Ich möchte sie in Floats umwandeln und zusammenfügen.
Was ist der beste Weg, dies zu tun? number_format scheint mit diesem Format nicht zu funktionieren, und str_replace scheint übertrieben zu sein, da ich es mehr als einmal für jede Nummer tun muss.
Gibt es einen besseren Weg? Vielen Dank.
php
parsing
floating-point
Aine
quelle
quelle
Antworten:
Das
str_replace()
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 mit ziemlicher Sicherheit die am wenigsten CPU-intensive Art und Weise, wie Sie dies tun können, und es besteht die Wahrscheinlichkeit, dass dies unter der Haube geschieht, selbst wenn Sie eine ausgefallene Funktion verwenden.
quelle
$number = str_replace( [',','.'], ['.'], $string_number )*1.0;
replace
. Die richtige Zeile lautet also$number = str_replace( ['.',','], ['','.'], $string_number )*1.0;
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); }
Dies funktioniert für alle Arten von Eingaben (amerikanischer oder europäischer Stil)
echo floatvalue('1.325.125,54'); // The output is 1325125.54 echo floatvalue('1,325,125.54'); // The output is 1325125.54 echo floatvalue('59,95'); // The output is 59.95 echo floatvalue('12.000,30'); // The output is 12000.30 echo floatvalue('12,000.30'); // The output is 12000.30
quelle
Wenn Sie PHP5.3 oder höher verwenden, können Sie numfmt_parse verwenden , um "ein umgekehrtes Zahlenformat" auszuführen. Wenn nicht, haben Sie die Vorkommen nicht durch preg_replace / str_replace ersetzt.
quelle
intl
Erweiterung aktiviert ist. Es ist nicht eingebaut, es muss entweder explizit kompiliert oder als separate Erweiterung installiert werden. Nicht alle Hosting-Anbieter installieren es mit PHP.Sie können die NumberFormatter- Klasse mit ihrer
parse
Methode verwenden .quelle
intl
Erweiterung kompiliert.Angenommen, sie befinden sich in einer Datei oder einem Array, ersetzen Sie sie einfach als Stapel (dh auf einmal):
$input = str_replace(array('.', ','), array('', '.'), $input);
und dann verarbeiten Sie die Zahlen von dort aus, wobei Sie die lose typisierte Natur von PHP voll ausnutzen.
quelle
Könnte übertrieben aussehen, konvertiert jedoch jedes Format, unabhängig vom Gebietsschema:
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); }
Ausgabe:
.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
quelle
aus dem PHP-Handbuch:
Ich würde diesen Weg gehen und dann von String zu Float - Floatval konvertieren
quelle