2010-12-27 3 views
1

У меня проблемы с регулярным выражением. Я пытаюсь взять сумму в размере $ 28,84 и хранить ее в моей базе как пенни. Сейчас я использую этотДоллары до копейки

$amount="$28.84"; 
$amount_number= ereg_replace("[(^0-9)(.)(0-9){2}]", "", $amount); //return a decimal 
$store_amount = $amount_number*100; //get number of pennies 

Я также пытаюсь лишить ряд «» „“ и ничего не десятичного числа.

+0

мне нужно немного больше информации об условиях ошибок. Другими словами, вы уже проверили, соответствует ли $amount? Что делать, если слишком много или слишком мало десятичных знаков? Недопустимые символы? Похоже, вы говорите, что ничего, кроме цифры, просто лишено, но я пытаюсь убедиться, что это действительно то, что вы хотите. – Andrew

+0

И в чем проблема? –

+2

Не используйте ereg: он устарел. –

ответ

5

Я думаю, вы идете об этом неправильно. Почему бы не заменить знак доллара, используйте floatval, а затем умножьте его на 100. Затем используйте intval, чтобы избавиться от десятичного числа от результата, так как вы не хотите долей копейки.

$amount = intval(floatval(str_replace("$", "", $amount))*100); 

Я не тестировал его, но что-то подобное должно работать.

Проверьте здесь, как некоторые люди обрабатывают валюту. У них есть много способов:
http://php.net/manual/en/function.floatval.php

+0

Будет ли это работать с запятой в размере? – BandonRandon

+0

Я не уверен - вы можете попробовать, или заменить запятые пустой строкой. Просто добавьте еще один 'str_replace' вокруг первого. – zsalzbank

+0

+ 1, поскольку регулярное выражение для арифметических процедур смешно. – cbrandolino

0
$amount = "$28.84"; 
$amount_number = floatval(substr($amount,1)); 
$store_amount = $amount_number*100.0; 

Чтобы удалить знак доллара, вы можете использовать substr. Если вы действительно хотите использовать регулярное выражение, попробуйте следующее:

$amount = "$28.84"; 
$amount_number = floatval(preg_replace('/[^\d\.]/', '', $amount)); 
$store_amount = $amount_number*100.0; 

Вы должны использовать floatval конвертировать сумму из строки поплавка.

1
[(^0-9)(.)(0-9){2}] 

должен быть

[0-9.] 

Вы не можете использовать() внутри []. Единственным специальным символом, который можно использовать внутри [], является символ ^.

4

Предполагая, что вход уже проверен, удалите все нецифровые символы, затем преобразуйте результат в целое число, используя int_val.

Лично я бы отказался от всех нестандартных входов, таких как $12.3. На мой взгляд, имея дело с деньгами, вы должны быть строгими в отношении того, какие материалы вы принимаете, а не пытаться угадать, что подразумевалось.

+1

Предполагается, что после десятичной точки всегда есть ровно две цифры. В противном случае 23.4 и 2.34 будут преобразованы в одно и то же целое число. –

+0

+1. Некоторые ссылки: http://www.google.com/search?q=floating+point+limitations http://docs.sun.com/source/806-3568/ncg_goldberg.html – asveikau

+0

Проверка выполняется на стороне javascript вещей, которые должны отлично работать, если кто-то не отключил JavaScript и не был глуп. – BandonRandon

0

Почему бы вам не просто удалить знак доллара и несколько на 100?

preg_replace (/ \ $ /, "", $ amount);

+0

Мне тоже нужно удалить запятую. – BandonRandon

0

Попробуйте чейнинга вторую строку следующим образом:

$amount_number= ereg_replace("[^0-9.]", "", $amount); 
+0

Я пробовал это, это тоже разделит десятичный знак, поэтому 5,00 долларов США становятся 500 и поэтому возвращают 500000, которые являются копейками за 500 долларов, а не 5 долларов США – BandonRandon

+1

Если. лишается, тогда количество не нужно умножать на 100, чтобы преобразовать его в гроши. – Chandu

1
$amount = "$28.84"; 
$amount = preg_replace("#([^0-9\.]+)#", "", $amount); 
$amount = explode(".", $amount); 
$amount = (intval($amount[0]) * 100) + intval($amount[1]); 
echo $amount; //2884 
+0

Этот ответ был полезен для меня, он решил проблему, которую я имел. Благодаря! Ура! –

Смежные вопросы