web-dev-qa-db-ja.com

PHP

このような文字列の浮動小数点値を取得する方法はありますか:parsefloat(str_replace(',', '.', $var))以外の75,25 €

これを現在のサイトの言語に依存させたいのですが、コンマをドットに置き換えることもできます。

34
cili

使用できます

マニュアルの例:

_$formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
var_dump($formatter->parseCurrency("75,25 €", $curr));
_

与える:float(75.25)

intl extension はデフォルトでは有効になっていないことに注意してください。 インストール手順 を参照してください。

43
Gordon

これはもう少し複雑で遅いソリューションですが、すべてのロケールで機能します。 @rlenomのソリューションは小数点記号としてのみドットを使用し、スペイン語などの一部のロケールでは小数点記号としてコンマを使用するためです。

<?php

public function getAmount($money)
{
    $cleanString = preg_replace('/([^0-9\.,])/i', '', $money);
    $onlyNumbersString = preg_replace('/([^0-9])/i', '', $money);

    $separatorsCountToBeErased = strlen($cleanString) - strlen($onlyNumbersString) - 1;

    $stringWithCommaOrDot = preg_replace('/([,\.])/', '', $cleanString, $separatorsCountToBeErased);
    $removedThousendSeparator = preg_replace('/(\.|,)(?=[0-9]{3,}$)/', '',  $stringWithCommaOrDot);

    return (float) str_replace(',', '.', $removedThousendSeparator);
}

テスト:

['1,10 USD', 1.10],
['1 000 000.00', 1000000.0],
['$1 000 000.21', 1000000.21],
['£1.10', 1.10],
['$123 456 789', 123456789.0],
['$123,456,789.12', 123456789.12],
['$123 456 789,12', 123456789.12],
['1.10', 1.1],
[',,,,.10', .1],
['1.000', 1000.0],
['1,000', 1000.0]

警告:小数部分が2桁を超える場合、失敗します。

これは、このライブラリの実装です。 https://github.com/mcuadros/currency-detector

45
mcuadros

ereg_replaceを使用します

$string = "$100,000";
$int = ereg_replace("[^0-9]", "", $string); 
echo $int;

出力

1000000

function toInt($str)
{
    return (int)preg_replace("/\..+$/i", "", preg_replace("/[^0-9\.]/i", "", $str));
}

更新


<?php
$string = array("$1,000,000.00","$1 000 000.00","1,000 000.00","$123","$123 456 789","0.15¢");
foreach($string as $s) {
    echo $s . " = " . toInt($s) . "\n"; 
}
function toInt($str)
{
    return preg_replace("/([^0-9\\.])/i", "", $str);
}
?>

出力

$1,000,000.00 = 1000000.00
$1 000 000.00 = 1000000.00
1,000 000.00 = 1000000.00
$123 = 123
$123 456 789 = 123456789
0.15¢ = 0.15

整数としてキャストした場合

<?php
$string = array("$1,000,000.00","$1 000 000.00","1,000 000.00","$123","$123 456 789","0.15¢");
foreach($string as $s) {
    echo $s . " = " . _toInt($s) . "\n";    
}
function _toInt($str)
{
    return (int)preg_replace("/([^0-9\\.])/i", "", $str);
}
?>

出力

$1,000,000.00 = 1000000
$1 000 000.00 = 1000000
1,000 000.00 = 1000000
$123 = 123
$123 456 789 = 123456789
0.15¢ = 0

だからあなたはそれを持っています。単一行、1つを置き換えます。あなたは行ってもいいです。

42
rlemon

文字列から通貨記号を削除する必要があります。 PHPのintvalは、検出された最初の非数値文字で停止します。

$int = intval(preg_replace('/[^\d\.]/', '', '$100')); // 100

ただし、$100.25のような値がある場合は、代わりにfloatvalを使用できます。

$float = floatval(preg_replace('/[^\d\.]/', '', '$100.25')); // 100.25
9
Rocket Hazmat

PHPにはintvalここにドキュメントがあります )があり、これは(私が知る限り)JavaScriptのparseIntとまったく同じです。

しかし、価値のあることのために、どちらの機能もあなたがやろうとしていることを助けるとは思わない。最初の文字は非数値であるため、両方ともフリークアウトします(PHPは0を、JSはNaNを提供します)。したがって、どちらの言語でも、文字列/正規表現の解析を行う必要があります。

2
sdleihssirhc

キャストはあなたの友達です:

$int = (int) $string;

更新 opに基づく

次のようなものを試してください:

<?php

function extract_numbers($string)
{
    return preg_replace("/[^0-9]/", '', $string);
}

echo extract_numbers('$100');

?>

デモ: http://codepad.org/QyrfS7WE

1
Neal

私は初心者なので、おそらく以下のアプローチには(私ではなく他の人にとって)明らかなマイナス面があるかもしれませんが、とにかく共有すると思いました。 preg_replaceを使用するよりも高速か低速かを知りたいのですが、速度テストは行いませんでした。

$badChars = array("$", ",", "(", ")");
$dirtyString = "($3,895.23)";
$cleanString = str_ireplace($badChars, "", $dirtyString);
echo "$dirtyString becomes $cleanString<p>";

$ dirtyStringは配列にすることができるため、次のようになります。

$badChars = array("$", ",", "(", ")");
$dirtyStrings = array("($3,895.23)", "1,067.04", "$5683.22", "$9834.48");
$cleanStrings = str_ireplace($badChars, "", $dirtyStrings);

echo var_dump($cleanStrings);
1
user2840024

通貨記号を受け取らず、文字列だけを受け取った場合も同様の問題がありました(例:1,234,567.89または1.234.567,89)。

これにより、両方のケースをフロートに正規化できました。

$val = str_replace(",", ".", $formatted);
$val = preg_replace("/[\,\.](\d{3})/", "$1", $val);

しかし、ゴードンの答えはずっときれいです。

1
Edson Medina