4

所以我对如何在数据库中存储“钱”进行了相当多的研究,我认为我想要使用的系统是

将钱转换为 CENTS,然后将 CENTS 存储在字段类型为 DECIMAL (19,4) 的 MySQL 数据库中。

我的问题是,如果我有来自用户的输入字段......我该如何处理多种输入类型。IE:

$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);

此时,您可以通过转换为浮点数并乘以 100 来转换为美分。但是,这可能是不必要的。在执行数学运算时,您可能会遇到精度问题,但只需将值存储在数据库中,就可以在不更改值的情况下以原始形式完成(假设您的数据库表结构正确):

$input = (float)str_replace( ',', '', $input);
于 2011-07-08T19:16:47.100 回答
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 回答
1

这会将大多数十进制货币转换为其子单位。

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 回答
0

可能只是删除','和'。从字符串中,结果是以美分为单位的金额。

于 2011-07-08T19:11:46.213 回答
-3

您可能需要使用 strrpos 从后面解析字符串...如果您从末尾找到一个逗号 2 个点,那么假设它的外币是安全的,这些就是 CENTS...一旦确定,使用一个正则表达式来去除剩余的逗号(当然,在你将“CENTS”逗号转换为小数之后)......现在你有一个正常的 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 回答