Разбить число пополам, но исправить, когда вторая половина начинается с 0

0

У меня есть большое количество, которое я хочу разделить пополам. В этом примере позвольте использовать: 5639445604728832

Когда он разделяется пополам, он выглядит следующим образом:

56394456
04728832

Очевидно, второе число больше не является числом.

У меня есть следующий код, но я пытаюсь сделать так, чтобы он добавил 0 к концу первого числа, пока второе число официально не будет действительным числом. Может ли кто-нибудь помочь мне решить эту проблему?

function my_number_split($number)
{
    $half = (int) ( (strlen($number) / 2) ); // cast to int incase str length is odd
    $left = substr($number, 0, $half);
    $right = substr($number, $half);

    echo $left."<br />".$right;
}
  • 1
    $half = (int) ( (strlen($number) / 2) ); -> Не делай этого! Пожалуйста! Это плохая идея, и трудно понять, чего вы хотите. Попробуйте $half = strlen($number) >> 1; (аналогично удалению 1 бита, что аналогично делению на 2 и округлению) или $half = ceil( (strlen($number) / 2) ); ( ceil() округлите, используйте floor() чтобы округлить вниз). Оба метода лучше и проще для чтения.
  • 0
    Будет делать @IsmaelMiguel, спасибо за упоминание об этом cpilko
Показать ещё 1 комментарий
Теги:

3 ответа

1
Лучший ответ

Переписывание вашей функции, подобной этой, сделало бы трюк.

function my_number_split($number)
{
    $half = ceil( (strlen($number) / 2) ); 
    while (0 == substr($number, $half, 1) && $half <= strlen($number) ) $half++;
    $left = substr($number, 0, $half);
    $right = substr($number, $half);

    echo $left."<br />".$right;
}
  • 0
    (int) ( (strlen($number) / 2) ); Вы имели в виду strlen($number) >> 1; ?
  • 0
    Используя код ОП для этой строки.
Показать ещё 4 комментария
0

Это, вероятно, неэффективный способ, но для задачи:

if (preg_match('~\A(?<n1>.?(?:.(?=.*(.(?(2)\2)\z)))+0*)(?<n2>.+)~', $number, $m))
    echo $m['n1'] . "\n" . $m['n2'];
  • 0
    хаха мне нравятся твои рассуждения Я, к сожалению, не на этом уровне понимания регулярных выражений, оооо, мне придется пройти на этом. Очень, очень круто, хотя.
0

Простой цикл должен это сделать.
Что-то вроде этого -

function my_number_split($number)
{
    /* Logic to traverse ahead till a 0 is not found. */
    $str_len = strlen($number);
    $half_index = $str_len/2;
    while($half_index < $str_len){
        if($number[$half_index] != "0"){
            break;
        }
        $half_index++;
    }
    //Slicing string.
    $left = substr($number, 0, $half_index);
    $right = substr($number, $half_index);
    echo $left."<br />".$right;
}
my_number_split("5639445604728832");

/*
OUTPUT -
563944560
4728832
*/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню