2010-12-27 5 views
1

私はRegexに何か問題があります私は$ 28.84のような金額を取ってペニーとしてデータベースに保存しようとしています。今私は、私はまた、「」 『』とは何もない小数の数を取り除くしようとしているこのペニーへのドル

$amount="$28.84"; 
$amount_number= ereg_replace("[(^0-9)(.)(0-9){2}]", "", $amount); //return a decimal 
$store_amount = $amount_number*100; //get number of pennies 

を使用しています。

+0

私はエラー条件に少しより多くの情報が必要になります。つまり、$amountが正しい形式であるかどうかを既に確認していますか?小数点以下の桁数が多すぎる場合や小さすぎる場合はどうなりますか?無効な文字?数字以外のものは単に取り除かれていると言っているようですが、本当にあなたが望むものであることを確認しようとしています。 – Andrew

+0

あなたの問題は何ですか? –

+2

eregを使用しないでください:廃止予定です。 –

答えて

5

あなたはこれについて間違っていると思います。なぜドル記号を置き換えないのですか?floatvalを使い、100を掛けてください。そして、ペニーの分数を必要としないので、結果から小数を取り除くにはintvalを使います。

$amount = intval(floatval(str_replace("$", "", $amount))*100); 

私はテストしませんでしたが、このようなものが動作するはずです。

一部の人々が通貨を処理する方法については、こちらをご覧ください。彼らは、メソッドの多くを持っている:
http://php.net/manual/en/function.floatval.php

+0

これはコンマの分量で動作しますか? – BandonRandon

+0

私はよく分かりません。試してみるか、コンマを空の文字列に置き換えることもできます。最初のものの周りに別の 'str_replace'を追加するだけです。 – zsalzbank

+0

+ 1算術演算の正規表現を使用するのはばかげているので、 – cbrandolino

0
$amount = "$28.84"; 
$amount_number = floatval(substr($amount,1)); 
$store_amount = $amount_number*100.0; 

ドル記号を削除するには、substrを使用します。あなたが本当に正規表現を使用したい場合は、これを試してみてください。

$amount = "$28.84"; 
$amount_number = floatval(preg_replace('/[^\d\.]/', '', $amount)); 
$store_amount = $amount_number*100.0; 

あなたはフロートに文字列の量を変換するfloatvalを使用する必要があります。

1
[(^0-9)(.)(0-9){2}] 

は[]内のあなたは()を使用することはできません

[0-9.] 

でなければなりません。 []の中で使用できる唯一の特殊文字は^文字です。

4

入力が既に検証されていると仮定して、すべての非数字を削除し、int_valを使用して結果を整数に変換します。

個人的に私は$12.3のようなすべての非標準入力を拒否します。私の意見では、お金を扱うときは、あなたが受け入れる入力を厳格にし、何を意味するのか推測しようとはしません。

+1

これは、小数点の後に常に正確に2桁があることを前提としています。それ以外の場合、23.4と2.34は同じ整数に変換されます。 –

+0

+1。いくつかのリンク:http://www.google.com/search?q=floating+point+limitations http://docs.sun.com/source/806-3568/ncg_goldberg.html – asveikau

+0

検証はJavaScript側で行われています誰かがjavascriptを無効にしていて愚かでない限り、うまくいくはずのものです。 – BandonRandon

0

ドル記号を削除して100倍にするのはなぜですか。

preg_replace(/ \ $ /、 ""、$ amount);

+0

カンマも削除する必要があります。 – BandonRandon

0

は、次のように2つ目のラインをchaning試してみてください。

$amount_number= ereg_replace("[^0-9.]", "", $amount); 
+0

私はこれを試しましたが、これも小数点以下を切り捨てるので、$ 5.00は500になります。したがって、$ 500ではなく$ 5のペニーである500000を返します。 – BandonRandon

+1

。それをペニーに変換するために、100を掛ける必要はありません。 – Chandu

1
$amount = "$28.84"; 
$amount = preg_replace("#([^0-9\.]+)#", "", $amount); 
$amount = explode(".", $amount); 
$amount = (intval($amount[0]) * 100) + intval($amount[1]); 
echo $amount; //2884 
+0

この回答は私には役に立ちましたが、私が持っていた問題を解決しました。ありがとう!乾杯! –

関連する問題