2015-08-17 3 views
2

Я не могу использовать класс money_format или NumberFormatter. Я дал пользователям возможность определить, какой десятичный разделитель они хотят использовать - запятую или точку.PHP, работающий с деньгами из разных мест

// , or . 
$decimal_separator = getUserDecimalSeparator(); 

Теперь пользователь может ввести в поле input следующие значения:

1,200.10 
1.500,21 
1,50 
1.35 
1500.10 
1900,21 

Что мне нужно форматировать эти значения, чтобы вставить правильно в базу данных. Мое поле в базе данных - double(10,2).

Для обработки значений пользователь вставленные я хочу, чтобы они были преобразованы в (всегда с точкой в ​​качестве десятичного разделителя и без разделителя тысяч):

1200.10 
1500.21 
1.50 
1.35 
1500.10 
1900.21 

Так я думал о функции, поможет мне преобразовать значения.

function formatMoneyToDatabase($value, $separator) 
{ 
    $value = str_replace('.', ',', $value); 

    if($separator == ',') 
     return number_format($value, 2, '.', ''); 

    return number_format($value, 2, ',', ''); 
} 

Но это не будет работать по нескольким причинам:

  1. значение может иметь два, три или более сепараторов (1.000.000,50 или 1,000,000.50)
  2. мне нужно идентифицировать сепаратор значения
  3. мне нужно проверить, если значение имеет какие-либо десятичные значения
+0

1. Удалите все разделители с помощью регулярного выражения. 2. 'number_format()' с соответствующими разделителями, указанными вашим пользователем. – Cfreak

ответ

0

решить d, я считаю.

Я нашел решение в stackoverflow, с которым я не могу ссылаться, потому что потерял ссылку, но решение - по регулярному выражению.

if(!function_exists('formatMoneyToDatabase')) 
{ 
    function formatMoneyToDatabase($value) 
    { 
     return preg_replace('/[^\d]/', '', $value)/100; 
    } 
} 

100,000,000.12 -> 100000000.12 
75.000,12  -> 75000.12 
50.000.000  -> 50000000 
12,000,000  -> 12000000 

ПРИМЕЧАНИЕ: Я обосновал цену прежде, чем в другой функции регулярных выражений.

return preg_match('/^[0-9]+(?:\.[0-9]{2,' . $decimal_places . '}+)?$/', $price); 
Смежные вопросы