PHP和Money,将钱转换成美分

时间:2011-07-08 19:10:08

标签: php mysql currency money-format

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

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

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

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

将此转换为CENTS的最佳方法是什么?因为我们必须处理'字符串'并将它们转换为INT,并除以100 ...我尝试的所有内容都会因为与数字的“逗号”分离而引发问题。

任何想法或方向都将不胜感激。

7 个答案:

答案 0 :(得分:7)

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;
}

答案 1 :(得分:6)

看起来有一个NumberFormatter类提供parseCurrency方法。看看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";

答案 2 :(得分:2)

你可以删除这样的逗号:

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

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

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

答案 3 :(得分: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];
  }

答案 4 :(得分:1)

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

$ 1,234,567.89 = 123456789

£1,234,567.89 = 123456789

€1.234.567,89 = 123456789

12,34 EUR = 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;
}

答案 5 :(得分:0)

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

答案 6 :(得分:-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);
}