Как привести строку к int с несколькими положительными и отрицательными знаками? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь привести строку к int.Все работает нормально, но здесь есть небольшая проблема

echo (int)"--12"; //return 0, i want 12
echo (int)"---23";//return 0, i want -23
echo (int)"+-99"; //return 0, i want -99
...

Почему это произошло и как правильно разыграть в этом случае?Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 22 января 2019

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

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

Стоит отметить, что для этого может даже существовать регулярное выражение ... кто знает.

function intvaljunk($string) {
    $boolSignedNegative = false;
    $intIntStart = null;
    $intIntEnd = null;
    foreach (str_split($string) as $index => $char) {
        if (is_numeric($char)) {
            $boolSignedNegative = (
                $boolSignedNegative === false
                && $index > 0
                && is_null($intIntStart)
                && $string[$index - 1] === '-'
                    ? true
                    : $boolSignedNegative
            );
            $intIntStart = is_null($intIntStart) ? $index : $intIntStart;
            $intIntEnd = is_null($intIntStart) ? $intIntEnd : $index;
        } else if (!is_null($intIntStart) && !is_null($intIntStart)) {
            break;
        }
    }

    return (
        !is_null($intIntStart) && !is_null($intIntStart)
        ? intval(($boolSignedNegative ? '-' : '') . substr($string, $intIntStart, ($intIntEnd - $intIntStart) + 1))
        : null
    );
}

echo intvaljunk("--1") . PHP_EOL;
echo intvaljunk("---1") . PHP_EOL;
echo intvaljunk("+-1") . PHP_EOL;
echo intvaljunk("+-14991abc667") . PHP_EOL;
0 голосов
/ 22 января 2019

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

Код: ( Демо )

$signed_number_strings = ["--1", "---33", "+-444"];

foreach ($signed_number_strings as $string) {
    var_dump((int)preg_replace('~\++|-\+*-\+*~', '', $string));
}

Выход:

int(1)
int(-33)
int(-444)

Логика, лежащая в основе шаблона, заключается в том, чтобы сначала сопоставить / удалить 1 или более последовательных + знаков, ИЛИ знак -, за которым следует ноль или более +, за которыми следует - (и поглощение любого трейлинга + приметы). Если есть какие-либо дополнительные случаи, которые мой шаблон не обрабатывает правильно, пожалуйста, обновите ваш вопрос и оставьте мне комментарий.

p.s. Расширение моей второй ветви с помощью \+* является попыткой оптимизировать шаблон, чтобы он не перезапускал шаблон. Это можно было бы записать как ~\++|-\+*-~, что было бы немного меньше нагрузки на глазные яблоки. ( Демо ) * * тысяча двадцать две

0 голосов
/ 22 января 2019

вы можете извлечь число из строки. может помочь?!

$str = '--1';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...