PHP обрабатывает удобные отформатированные цены в стандартные числа - PullRequest
1 голос
/ 25 июля 2011

У меня есть форма, в которой пользователи могут вводить цены на товары.В идеале я хочу, чтобы пользователь мог добавлять цены любым удобным для него способом, а также для удобства чтения.Затем мне нужно преобразовать это в стандартное число с плавающей точкой, чтобы мой веб-сервис мог рассчитать затраты и т. Д.

Часть, с которой я борюсь, заключается в том, как взять начальный sting / float / int валюты и преобразовать его вa float.

Например:

UK: 1,234.00
FRA: 1 234,00
RANDOM: 1234
RANDOM2: 1234.00

Все они имеют несколько разные форматы.

Которые я бы хотел сохранить как:

1234.00

Затем я сохраню результат в базе данных MySQL как DECIMAL.

Любая помощь будет отличной.

Ответы [ 3 ]

1 голос
/ 25 июля 2011

Предполагая, что вы используете MySQL, используйте типы DECIMAL или NUMERIC для правильного хранения валюты.

Поплавки подвержены ошибкам округления и имеют ограниченную точность.

Форматирование для отображения должно обрабатываться PHP.

При хранении в БД вы, конечно, должны хранить код валюты - который можно использовать при получении, чтобы сообщить PHP, как его отображать

0 голосов
/ 25 июля 2011

В случае, если вы хотите принять так много разных форматов, немного сложно сделать это правильно.

Теперь мы можем просто использовать регулярное выражение для получения десятичной и полной частей значения:

/^([0-9,. ]+?)(?:[.,](\d{1,2})$|$)/

Регулярное выражение захватит полную часть числа + десятичную часть, разделенную символами a или a. и который имеет одно или два числа.

Группа захвата 1 будет содержать полную часть, а группа 2 - десятичную часть (если есть).

Чтобы получить свой номер, вам просто нужно отфильтровать все нечисловые символы из полной части и объединить отфильтрованные полную и десятичную части вместе.

Если вы хотите сделать его более надежным, вам, вероятно, следует реализовать что-то на стороне клиента, чтобы пользователь мог ввести значение в правильном формате.

0 голосов
/ 25 июля 2011

Не могли бы вы использовать:

floatval($AnyVar)
...