Ответ 1
Не тестировалось, но, вероятно, что-то вроде if(preg_match("/^[0-9,]+$/", $a)) $a = str_replace(...)
В PHP у меня есть массив переменных, которые являются ВСЕМИ строками. Некоторые из сохраненных значений представляют собой числовые строки с запятыми.
Что мне нужно:
Способ обрезать запятые из строк и ТОЛЬКО делать это для числовых строк. Это не так просто, как кажется. Основная причина заключается в следующем:
$a = "1,435";
if(is_numeric($a))
$a = str_replace(',', '', $a);
Это не работает, потому что $a = "1435"
является числовым. Но $a = "1,435"
не является числовым. Поскольку некоторые из строк, которые я получаю, будут регулярными предложениями с запятыми, я не могу выполнить замену строки на каждой строке.
Не тестировалось, но, вероятно, что-то вроде if(preg_match("/^[0-9,]+$/", $a)) $a = str_replace(...)
Сделайте это наоборот:
$a = "1,435";
$b = str_replace( ',', '', $a );
if( is_numeric( $b ) ) {
$a = $b;
}
Самый простой способ:
$var = intval(preg_replace('/[^\d.]/', '', $var));
или если вам нужно float:
$var = floatval(preg_replace('/[^\d.]/', '', $var));
function cleanData($a) {
if(is_numeric($a)) {
$a = preg_replace('/[^0-9,]/s', '', $a);
}
return $a;
}
Попробуйте это. Это сработало для меня.
number_format(1235.369,2,'.','')
если вы используете number_format, как это
number_format(1235.369,2)
ответ будет 1,235.37
но если вы используете, как показано ниже
number_format(1235.369,2,'.','')
ответ будет 1235.37
удаление "," из "1,235.37"
Если вы хотите удалить запятые из чисел внутри строки, которая также содержит слова, самым простым способом, я думаю, будет использовать preg_replace_callback:
Пример:
$str = "Hey hello, I've got 12,500 kudos for you, spend it well"
function cleannr($matches)
{
return str_replace("," , "" , $matches["nrs"]);
}
$str = preg_replace_callback ("/(?P<nrs>[0-9]+,[0-9]+)/" , "cleannr" , $str);
Выход:
"Привет, у меня есть 12500 центов для вас, хорошо проводите"
В этом случае шаблон (регулярное выражение) отличается от значения, указанного в принятом ответе, поскольку мы не хотим удалять другие запятые (пунктуация).
Если мы будем использовать /[0-9,]+/
здесь вместо /[0-9]+,[0-9]+/
, выход будет:
"Привет, у меня есть 12500 центов, потому что вы хорошо проводите"
Похоже, что идеальным решением для того, что вы ищете, является filter_var()
:
$a = filter_var($a, FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_THOUSAND);
(обратите внимание, что он использует FILTER_VALIDATE_FLOAT вместо FILTER_VALIDATE_INT, потому что у него в настоящее время нет опции FILTER_FLAG_ALLOW_THOUSAND).