4

だから私はデータベースに「お金」を保存する方法についてかなりの研究をしました、そして私が使いたいシステムは

Money を CENTS に変換し、その CENTS を DECIMAL (19,4) のフィールド タイプで MySQL DB に格納します。

私の質問は、ユーザーからの入力フィールドがある場合...複数の入力タイプをどのように処理すればよいですか。いいえ:

$input = "1,346.54"
$input = "10,985.23"
$input = "110,400.50"
$input = "1033.44"

などなど...

これをCENTSに変換する最良の方法は何ですか? 「文字列」を処理して INT に変換し、100 で割る必要があるため、数字の「コンマ」区切りのために、私が試みるすべての問題がスローされます。

どんな考えや方向性も大歓迎です。

4

7 に答える 7

8
function getMoneyAsCents($value)
{
    // strip out commas
    $value = preg_replace("/\,/i","",$value);
    // strip out all but numbers, dash, and dot
    $value = preg_replace("/([^0-9\.\-])/i","",$value);
    // make sure we are dealing with a proper number now, no +.4393 or 3...304 or 76.5895,94
    if (!is_numeric($value))
    {
        return 0.00;
    }
    // convert to a float explicitly
    $value = (float)$value;
    return round($value,2)*100;
}
于 2011-07-08T19:19:41.170 に答える
6

parseCurrencyメソッドを提供する NumberFormatter クラスがあるようです。http://www.php.net/manual/en/numberformatter.parsecurrency.phpをご覧ください。

提供される例は、

$fmt = new NumberFormatter( 'de_DE', NumberFormatter::CURRENCY );
$num = "1.234.567,89 $";
echo "We have ".$fmt->parseCurrency($num, $curr)." in $curr\n";
于 2011-07-08T19:18:41.840 に答える
2

次のようにコンマを削除できます。

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

この時点で、float に変換して 100 を掛けることでセントに変換できます。ただし、これはおそらく不要です。数学演算を実行するときに精度の問題が発生する可能性がありますが、データベースに値を格納するだけで、値を変更せずに元の形式で実行できます (DB テーブルが適切に構造化されている場合)。

$input = (float)str_replace( ',', '', $input);
于 2011-07-08T19:16:47.100 に答える
1

これにより、ほとんどの 10 進通貨がそのサブユニットに変換されます。

$1,234,567.89 = 123456789

1,234,567.89 ポンド = 123456789

€1.234.567,89 = 123456789

12,34 ユーロ = 1234

12,34 € = 1234

12,30 € = 1230

1,2 = 102

function convertDecimalCurrencyToSubUnit($str)
{
    if( preg_match('/^(.+)[^\d](\d|\d\d)[^\d]*$/', $str, $m) )
        return intval(preg_replace('/[^\d]/', '', $m[1]) . ( (strlen($m[2])>1) ? $m[2] : ('0' . $m[2]) ));
    return 0;
}
于 2014-08-13T23:23:20.807 に答える
1
function convert_to_cents($v)
  {
    $v = str_replace(',','',$v);
    $p = explode('.',$v);
    if(strlen($p[1])<2){ $p[1] = $p[1]*10;}
    return ($p[0]*100)+$p[1];
  }
于 2013-02-19T16:55:03.967 に答える
0

おそらく、「,」と「.」を削除するだけです。文字列から、結果はセント単位の金額です。

于 2011-07-08T19:11:46.213 に答える
-3

おそらく、strrpos を使用して文字列を後ろから解析する必要があります...最後から 2 桁のコンマを見つけた場合、その外貨を仮定しても安全であり、それらは CENTS です...それを決定したら、使用します残りのコンマを削除する正規表現(もちろん「CENTS」コンマを10進数に変換した後)...これで、通常のDEC番号で遊ぶことができます。

これを使用して、文字列の最後のコンマを見つけます... strrpos

これを使用してコンマを置き換えます preg_replace

ここに役立つ正規表現のウェブサイトがあります.. regexlib

//Finding the last comma

$yourCommaPos = strrpos($myString, ',');
if ($yourCommaPos == strlen($myString) - 2) {
 //Comma is foreign currency decimal
 // Replace with '.'
} else {
 //Not foreign Currency so...
 //Strip Commas
 preg_replace(',', '', $myString);
}
于 2011-07-08T19:17:28.833 に答える