Утвердить десятичное число в (известном) национальном формате

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

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

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

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

5 ответов

Решение

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

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

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

<?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 для вывода числа с плавающей точкой в ​​принимаемые вами форматы и попытаться сопоставить исходный формат с любым из них. вы сгенерировали.

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

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

$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 => '.'));

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

Другие вопросы по тегам