Утвердить десятичное число в (известном) национальном формате - PullRequest
1 голос
/ 31 мая 2010

PHP имеет много встроенных функций для проверки чисел, но все они ожидают ввода в формате computer : 1234.56. Мне нужно проверить такие вещи, как 1,234.56 (английский) или 1.234,56 (испанский), вместе с некоторыми типичными атрибутами (допустимый диапазон, максимальное количество десятичных знаков и т. Д.).

Я начал писать свою собственную функцию, но вскоре заблудился. Легко прочитать пользовательский ввод в переменную типа float, но я хочу иметь возможность обнаруживать числа с недопустимыми форматами, такими как 1,23456.7 или 1..25.

Есть ли у вас какие-либо рекомендации по этому вопросу?

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

Ответы [ 5 ]

3 голосов
/ 31 мая 2010

Выезд NumberFormatter::parse. Вы можете анализировать номера во многих локалях с ним. Целое расширение intl полезно, хотя оно еще не совсем "там".

1 голос
/ 31 мая 2010

В дополнение к данным решениям, я бы рекомендовал PEAR Validation package для проверки чисел.

Вот пример с их сайта:

<?php
require_once 'Validate.php';

$number = '-8,1';
if (Validate::number($number,
    array('decimal' => '.,', 'min' => -9, 'max' => -7 ))) {
    echo 'Valid';
} else {
    echo 'Invalid';
}

Если вы хотите быть более строгим в формате, вы можете проанализировать его как число с плавающей точкой (что вы сделали), а затем использовать number_format , чтобы вывести число с плавающей точкой в ​​принимаемые вами форматы, и попытаться сопоставьте исходный формат с любым из созданных вами.

1 голос
/ 31 мая 2010

Я нашел интересную функцию в комментарии в руководстве по PHP: http://fr2.php.net/manual/en/language.types.float.php#92885 Посмотри.

1 голос
/ 31 мая 2010

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

$ds = '.'; // Decimal separator
$ts = ','; // Thousand separator

$isValidFloat = preg_match(
    '/^

         # Integer part, one of the two allowed formats:
         # 1) with thousand separator, grouped by 3 digits
         # 2) without thousand separator
         (\d{1,3}(' . preg_quote($ts) . '\d{3})* | \d+)

         # Optional decimal part
         (' . preg_quote($ds) . '\d+)?

    $/x', $string);

И преобразовать его в число с плавающей точкой так:

$float = (float) strtr($string, array($ts => '', $ds => '.'));
0 голосов
/ 31 мая 2010

Вы выполняете все расчеты, и для переменной результата вы можете использовать встроенную функцию number_format, чтобы отформатировать ее в соответствии с вашими требованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...