PHP и деньги, перевод денег в центы - PullRequest
3 голосов
/ 08 июля 2011

Итак, я провел немало исследований о том, как хранить «деньги» в базе данных, и я думаю, что система, которую я хочу использовать, -

Преобразование денег в CENTS и последующее сохранение CENTS в БД MySQL с типом поля DECIMAL (19,4).

У меня вопрос: если у меня есть поле ввода от пользователя ... как мне работать с несколькими типами ввода. IE:

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

и т. Д. И т. Д. *

Каков будет лучший метод для преобразования этого в CENTS? Поскольку нам приходится иметь дело со «строками», преобразовывать их в INT и делить на 100 ... Все, что я пытаюсь, вызывает проблемы из-за разделения «запятыми» на числа.

Буду очень признателен за любые мысли или указания.

Ответы [ 7 ]

7 голосов
/ 08 июля 2011
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;
}
6 голосов
/ 08 июля 2011

Похоже, что существует класс 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 голосов
/ 08 июля 2011

Вы можете удалить запятые следующим образом:

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

На данный момент вы можете конвертировать в центы, конвертируя в число с плавающей точкой и умножая на 100. Однако это, вероятно, не нужно. Вы можете столкнуться с проблемами точности при выполнении математических операций, но простое сохранение значений в базе данных может быть выполнено в исходной форме без изменения значения (при условии, что ваши таблицы БД правильно структурированы):

$input = (float)str_replace( ',', '', $input);
1 голос
/ 14 августа 2014

Преобразует большинство десятичных валют в их субъединицы.

$ 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;
}
1 голос
/ 19 февраля 2013
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];
  }
0 голосов
/ 08 июля 2011

Вам, вероятно, понадобится проанализировать строку сзади, используя strrpos ... Если вы найдете запятую в 2 точках с конца, то, вероятно, можно предположить, что это иностранная валюта, а это центы ... Как только вы определите что, используйте регулярное выражение, чтобы убрать оставшиеся запятые (после того, как вы, конечно, конвертируете запятую "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);
}
0 голосов
/ 08 июля 2011

Возможно, просто удалите ',' и '.' из строки результатом является сумма в центах.

...