Утвердить десятичное число в (известном) национальном формате
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
отформатировать его в соответствии с вашими требованиями.