Как проверить, является ли введенное значение валютой - PullRequest
16 голосов
/ 13 февраля 2011

Как проверить, является ли введенное значение валютой. Желательно с помощью регулярного выражения или функции php.

(значения типа 1550.50, 1500 или 100.75)

Ответы [ 4 ]

49 голосов
/ 13 февраля 2011

Полагаю, что вы действительно хотите, это способ узнать любое число из числа , которое имеет смысл в качестве значения валюты.Так что 1.04e-7, вероятно, не должно совпадать, и не должно 1.234 или 12.3, хотя все они, конечно, числовые.

Наконец, вы должны ожидать тысячи разделителей, таких как 1,234.56 (который, как и десятичная точка, также может варьироваться в зависимости от региона).Итак, если вы когда-нибудь захотите проверить значения валют, используя точку в качестве десятичного разделителя и запятую в качестве необязательного разделителя тысяч, попробуйте следующее:

/\b\d{1,3}(?:,?\d{3})*(?:\.\d{2})?\b/

Объяснение:

\b      # word boundary assertion
\d{1,3} # 1-3 digits
(?:     # followed by this group...
 ,?     # an optional comma
 \d{3}  # exactly three digits
)*      # ...any number of times
(?:     # followed by this group...
 \.     # a literal dot
 \d{2}  # exactly two digits
)?      # ...zero or one times
\b      # word boundary assertion
23 голосов
/ 19 февраля 2013

Я использую это:

function isCurrency($number)
{
  return preg_match("/^-?[0-9]+(?:\.[0-9]{1,2})?$/", $number);
}

//usage examples
echo (isCurrency("10.36") ? "TRUE" : "FALSE");
echo (isCurrency(10.3) ? "TRUE" : "FALSE");

Остерегайтесь:

  1. эта функция также принимает отрицательные значения в валюте, если вы не хотите их принимать, удалите-?, который вы найдете в начале preg_match

  2. , эта функция возвращает TRUE также для значений, подобных 13.7 (только один десятичный знак), если вы хотите десятичную дробьбыть всегда двумя, чем заменить {1,2} на {2} (но перед этим прочитайте пункт 3 ниже)

  3. эта функция возвращает TRUE также для значений типа 0000.78 (большечем один ведущий ноль), но обычно этот вид функции необходим для фильтрации значений, представленных формами, перед вставкой их в поля БД типа DECIMAL(n.2).При вставке в поля такого типа MySQL принимает как 0000.78 и 13.7 в качестве допустимых значений в запросе, и автоматически преобразует их в 0.78 и 13.70

1 голос
/ 13 февраля 2011

Вы не можете быть уверены.Пользователь может думать о цыплятах.Вам нужно проверить, вошел ли пользователь в число с плавающей точкой.Посмотрите на preg_match: http://jp2.php.net/manual/en/function.preg-match.php

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

0 голосов
/ 28 ноября 2018

Я быстро включил функцию для проверки, является ли строка или int действительной ценой, и если нет, для ее преобразования.Окончательный результат всегда будет строкой с двумя цифрами после десятичной дроби, например 1000.00.

. Он удаляет знаки минус / минус, запятые, пробелы и знаки доллара.Единственное исключение - это когда строка содержит какие-либо символы, такие как буквы, которые установят для is_numeric() значение false.

Вот функция:

function convertToValidPrice($price) {
    $price = str_replace(['-', ',', '$', ' '], '', $price);
    if(!is_numeric($price)) {
        $price = null;
    } else {
        if(strpos($price, '.') !== false) {
            $dollarExplode = explode('.', $price);
            $dollar = $dollarExplode[0];
            $cents = $dollarExplode[1];
            if(strlen($cents) === 0) {
                $cents = '00';
            } elseif(strlen($cents) === 1) {
                $cents = $cents.'0';
            } elseif(strlen($cents) > 2) {
                $cents = substr($cents, 0, 2);
            }
            $price = $dollar.'.'.$cents;
        } else {
            $cents = '00';
            $price = $price.'.'.$cents;
        }
    }

    return $price;
}

это проверить это:

var_dump(convertToValidPrice('100'));          // 100.00
var_dump(convertToValidPrice('-100'));         // 100.00
var_dump(convertToValidPrice(100));            // 100.00
var_dump(convertToValidPrice('$100'));         // 100.00
var_dump(convertToValidPrice('100.98'));       // 100.98
var_dump(convertToValidPrice('100.9'));        // 100.90
var_dump(convertToValidPrice('100.'));         // 100.00
var_dump(convertToValidPrice('1,00.98'));      // 100.98
var_dump(convertToValidPrice('1,000.98'));     // 1000.98
var_dump(convertToValidPrice('100.98829382')); // 100.98
var_dump(convertToValidPrice('abc'));          // null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...