2010-05-31 2 views
1

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

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

У вас есть рекомендации по этому вопросу?

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

ответ

3

Отъезд NumberFormatter::parse. Вы можете анализировать номера во многих местах. Весь внутренний набор полезен, хотя он еще не совсем «там».

+0

К сожалению, работает только в PHP 5.3+, но приятные решения в любом случае не знали об этом. –

-1

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

+0

Я не хочу конвертировать из float в строку. Я хочу проверить, содержит ли строка действительное число в национальном формате. '12.345' - допустимое число, но я не могу сохранить его в столбце DECIMAL (4,2). «1000» - действительное число, но не действительная скидка. –

1

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

+0

Хотя я не применяю непосредственно к своей проблеме, это остроумный подход. Слишком плохо, я испугался setlocale() после того, как у вас возникли некоторые ошибки в реализации Windows. –

1

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

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

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

+0

Я посмотрю. (Лучше не быть таким строгим: для меня «1000.5» так же справедливо, как «1000.50».) –

Смежные вопросы