0 Пользователей и 1 Гость просматривают эту тему.
  • 10 Ответов
  • 1208 Просмотров
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Есть число с фиксированным набором знаков, необходимое кол-во знаков дописывается нулями в начале перед числом. Число вообще может быть равно 0, в этом случае оно будет выглядеть как '000000000000'. Число храниться в базе как строка и выводится во фронт компонентом. Вывод нужно сделать с форматированием, вставив пробелы в качестве разделителя групп: '000 000 000 000'. Как это можно реализовать быстро? number_format($this->escape($this->item->code), 0, '', ' ') выводит '0'. Имеется ли в php функция, аналогичная number_format, но учитывающая необходимое фиксированное кол-во знаков в результате?
*

icom

  • Давно я тут
  • 830
  • 202 / 4
Re: Форматирование числа в ведущими 0
« Ответ #1 : 07.11.2014, 22:11:34 »
можно так
Код
$code = '000000000000'.$this->item->code;
$code = substr($code, -12);

$res = '';
$g = 0;
for ($i = 0; $i < strlen($code); $i++) {
  if ($g == 3) {
    $res .= ' ';
    $g = 0;
  }

  $g++;
  $res .= $code[$i];
}

echo $res;
« Последнее редактирование: 07.11.2014, 23:58:42 от icom »
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Re: Форматирование числа в ведущими 0
« Ответ #3 : 07.11.2014, 23:01:34 »
sprintf / printf / +доработать
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Форматирование числа в ведущими 0
« Ответ #4 : 07.11.2014, 23:48:45 »
Велосипед:
Код: php
  /*
   * string форматируемое число
   * int общее кол-во символов
   * int кол-во символов в блоке
  */
  function f_number($num,$rlenght,$rcount) {
    $num = preg_replace("[^0-9]",'',$num);
    if ($rlenght) {
      if (strlen($num) < $rlenght) {
        $num = str_pad($num, $rlenght, '0', STR_PAD_LEFT);
      } else if (strlen($num) > $rlenght) {
        $num = substr($num,0,$rlenght);
      }
    } else {
      $rlenght = strlen($num);
    }

    $result = '';
    while (strlen($num) > $rcount) {
      $result = substr($num,-$rcount).' '.$result;
      $num = substr($num,0,-$rcount);
    }
    if (strlen($num))
      $result = $num.' '.$result;

    return $result;
  }
Работает, меня устраивает. Оптимизация приветствуется.
« Последнее редактирование: 07.11.2014, 23:55:06 от AlekVolsk »
*

icom

  • Давно я тут
  • 830
  • 202 / 4
Re: Форматирование числа в ведущими 0
« Ответ #5 : 08.11.2014, 00:00:14 »
можно так
Код
$code = '000000000000'.$this->item->code;
$code = substr($code, -12);

$res = '';
$g = 0;
for ($i = 0; $i < strlen($code); $i++) {
  if ($g == 3) {
    $res .= ' ';
    $g = 0;
  }

  $g++;
  $res .= $code[$i];
}

echo $res;

а лучше так
Код
echo chunk_split(str_pad($this->item->code, 12, '0', STR_PAD_LEFT), 3, ' ');
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Форматирование числа в ведущими 0
« Ответ #6 : 08.11.2014, 00:09:42 »
Хороший рефакторинг )) но кол-во знаков может быть и не кратным кол-ву знаков в блоке, т.е. не 12 и 3, а 9 и 4, тогда
Код: php
echo chunk_split(str_pad('0', 9, '0', STR_PAD_LEFT), 4, ' ');
вернет '0000 0000 0', а надо '0 0000 0000', т.о. chunk_split() не подходит, ибо разбиение не стой стороны начинает.
*

icom

  • Давно я тут
  • 830
  • 202 / 4
Re: Форматирование числа в ведущими 0
« Ответ #7 : 08.11.2014, 00:26:01 »
Код: php
echo strrev(chunk_split(strrev(str_pad('0', 9, '0', STR_PAD_LEFT)), 4, ' '));
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Форматирование числа в ведущими 0
« Ответ #8 : 08.11.2014, 00:28:15 »
Шиворот-навыворот-задом-наперед )))

Код: php
  function f_number($num,$rlenght,$rcount) {
    return strrev(chunk_split(strrev(str_pad($num, $rlenght, '0', STR_PAD_LEFT)), $rcount, ' '));
  }
Работает, решено.
« Последнее редактирование: 08.11.2014, 00:32:19 от AlekVolsk »
*

icom

  • Давно я тут
  • 830
  • 202 / 4
Re: Форматирование числа в ведущими 0
« Ответ #9 : 08.11.2014, 00:33:38 »
Код: php
function f_number($num,$rlenght,$rcount) {
    return strrev(chunk_split(strrev(str_pad($num, $rlenght, '0', STR_PAD_LEFT)), $rcount, ' '));
}
окончательный вариант)

UPD: а, уже исправил)
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Форматирование числа в ведущими 0
« Ответ #10 : 08.11.2014, 00:41:41 »
Общая длина может быть произвольной, а может и фиксированной, согласно заданным параметрам (используется в компоненте).
Если длина фиксированная, а строка больше заданной длины, сделаем ей обрезание.
А еще бывают случаи, когда строка уже содержит лишние пробелы не в тех местах где нужно (данные импортируются на сайт извне).

Окончательный вариант пока так:
Код: php
  protected function f_number($num,$rlenght,$rcount) {
    $num = preg_replace("[^0-9]",'',$num);
    if ($rlenght) {
      if (strlen($num) > $rlenght)
        $num = substr($num,0,$rlenght);
    } else {
      $rlenght = strlen($num);
    }
    return strrev(chunk_split(strrev(str_pad($num, $rlenght, '0', STR_PAD_LEFT)), $rcount, ' '));
  }
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Форматирование текста. Вопрос связан с MySQL

Автор Аня

Ответов: 6
Просмотров: 742
Последний ответ 06.05.2018, 00:35:31
от Аня
Сортировка материалов категории, содержащии в названии числа

Автор RezistoR

Ответов: 2
Просмотров: 886
Последний ответ 15.12.2015, 23:49:36
от robert