価格のリストに小数点のコンマと千の区切り記号としてのドットがあります。
いくつかの例:
12,30
116,10
1.563,14
これらは、サードパーティからこの形式で提供されます。それらをフロートに変換し、一緒に追加したいです。
これを行う最良の方法は何ですか? number_formatはこのフォーマットでは機能しないようです。str_replaceは、やり過ぎだと思われます。
より良い方法はありますか?ありがとう。
str_replace()
を使用してドットを削除するのはやり過ぎではありません。
$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;
これはほぼ確実にこれを行うことができる最もCPU集約的な方法ではなく、奇妙な機能を使用してそれを行う場合でも、これは内部で行うことです。
PHP5.3以降を使用している場合は、 numfmt_parse を使用して「a reverse number_format」を実行できます。そうでない場合は、発生をpreg_replace/str_replaceで置き換えることに固執します。
NumberFormatterクラス を parse
メソッド とともに使用できます。
この関数は、小数としてドットまたはコンマを使用した数値と互換性があります
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
それらがファイルまたは配列にあると仮定すると、単にバッチとして置き換えます(つまり、一度にすべて):
$input = str_replace(array('.', ','), array('', '.'), $input);
pHPの緩やかに型付けされた性質を最大限に活用して、そこから数値を処理します。
過度に見えるかもしれませんが、ロケールに関係なく、指定されたフォーマットを変換します。
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);
}
出力:
.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