Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> алгоритм генерации штрих-кода, помогите с реализацией 
V
    Опции темы
wofs
Дата 25.3.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 1.5.2007

Репутация: нет
Всего: нет



проблема с реализацией
есть алгоритм расчета контрольного разряда EAN-13
есть начальный штрих-код, например
2003425000004
задача сформировать следующий по порядку по идее он будет следующего вида
2003426000003
так вот 3 - контрольный разряд, как реализовать на делфи его расчет?

Добавлено через 3 минуты и 35 секунд
нужно именно рассчитать, задача нарисовать не ставится
PM MAIL   Вверх
Frees
Дата 25.3.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Код

function CalculateEANCheckSum(Str:String):Char;
var iSumOdd, iSumEven, iSum, iDigit, i, iCheckSum:Integer;
begin
  Result := #0;
  iSumOdd:=0;
  iSumEven:=0;
    for i:=length(Str) downto 1 do
    begin
      if not TryStrToInt(Str[length(Str)-i+1], iDigit) then
        exit;

      if (i mod 2 = 0) then  // even
        iSumEven:=iSumEven + iDigit
          else // odd
        iSumOdd:=iSumOdd + iDigit;
    end;
    iSum:=(iSumOdd*3) + iSumEven;
    iCheckSum:= ( 10 - ( iSum mod 10 ) );
    Result:=IntToStr(iCheckSum)[1];
end;

параметром приходит строка штрих кода 12 цифр


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
wofs
Дата 26.3.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 1.5.2007

Репутация: нет
Всего: нет



спасибо, вопрос некорректно поставил smile, но половина вопроса решена
есть 200342500000
как рассчитать следующий, что бы получить вот это 200342600000
т.е. к последней цифре прибавить 1(единичку)?
PM MAIL   Вверх
Frees
Дата 27.3.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



я делаю так

Код

function CalculateEANCheckSum(Str: string): Char;
var iSumOdd, iSumEven, iSum, iDigit, i, iCheckSum: Integer;
begin
  Result := #0;
  iSumOdd := 0;
  iSumEven := 0;
  for i := length(Str) downto 1 do
  begin
    if not TryStrToInt(Str[length(Str) - i + 1], iDigit) then
      exit;

    if (i mod 2 = 0) then // even
      iSumEven := iSumEven + iDigit
    else // odd
      iSumOdd := iSumOdd + iDigit;
  end;
  iSum := (iSumOdd * 3) + iSumEven;
  iCheckSum := (10 - (iSum mod 10));
  Result := IntToStr(iCheckSum)[1];
end;

function GenEAN(pref, Num, suf: string): string;
var len: Integer;
  I: Integer;
begin
  len := 12;
  len := len - (Length(pref) + Length(Num) + Length(suf));
  if len < 0 then
    raise Exception.Create('Слишком длинный код');
  result := pref + Num;
  for I := 0 to len - 1 do
    result := result + '0';
  result := result + suf;
  result := result + CalculateEANCheckSum(result)
end;

function CheckEANCode(Code: string): boolean;
begin
  result := ((Length(Code) = 8) or (Length(Code) = 13))
    and (CalculateEANCheckSum(Copy(Code, 0, Length(Code) - 1)) = Code[Length(Code)]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  sEan: string;
begin
  for I := 3425 to 3435 do
  begin
    Memo1.Lines.add(GenEAN('20', '', IntToStr(I)));
  end;
end;


а из кокого то номера получить следующий номер не реально так как ты не знаеш какие 0 значищие а какие нет если только номер не с конца пишется.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
wofs
Дата 27.3.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 1.5.2007

Репутация: нет
Всего: нет



хм.. спасибо, будем менять логику) вопрос решен
PM MAIL   Вверх
wofs
Дата 9.10.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 1.5.2007

Репутация: нет
Всего: нет



Так прошло какое-то время....
И чтоб не плодить похожих тем поднимаю эту.
Есть БД на MySQL.
Как мне с помощью делфи генерировать уникальный штрих-код для каждой добавленной в таблицу новой записи.
Еще нужна возможность изменять первые 3 (левые 3) разряда кода.
PM MAIL   Вверх
wofs
Дата 10.10.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 1.5.2007

Репутация: нет
Всего: нет



Ох, ребят, простите, не выспался наверное...

Frees предложил же полностью готовый код для формирования штрих-кода...
тема закрыта!!!
PM MAIL   Вверх
Frees
Дата 10.10.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



пол года спал...?))


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
migur
Дата 19.3.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



Цитата(Frees @ 25.3.2009,  15:20)
Код

function CalculateEANCheckSum(Str:String):Char;
var iSumOdd, iSumEven, iSum, iDigit, i, iCheckSum:Integer;
begin
  Result := #0;
  iSumOdd:=0;
  iSumEven:=0;
    for i:=length(Str) downto 1 do
    begin
      if not TryStrToInt(Str[length(Str)-i+1], iDigit) then
        exit;

      if (i mod 2 = 0) then  // even
        iSumEven:=iSumEven + iDigit
          else // odd
        iSumOdd:=iSumOdd + iDigit;
    end;
    iSum:=(iSumOdd*3) + iSumEven;
    iCheckSum:= ( 10 - ( iSum mod 10 ) );
    Result:=IntToStr(iCheckSum)[1];
end;

параметром приходит строка штрих кода 12 цифр


Спасибо большое за пример  smile 
Но в нем есть одна ошибка, подсчета контрольного разряда, контрольный разряд может получится кратный 10 в этом случаи выводится 1 а должен быть 0, необходимо добавить проверку в конце.

Код

function CalculateEANCheckSum(Str:String):Char;
var iSumOdd, iSumEven, iSum, iDigit, i, iCheckSum:Integer;
begin
  Result := #0;
  iSumOdd:=0;
  iSumEven:=0;
    for i:=length(Str) downto 1 do
    begin
      if not TryStrToInt(Str[length(Str)-i+1], iDigit) then
        exit;

      if (i mod 2 = 0) then  // even
        iSumEven:=iSumEven + iDigit
          else // odd
        iSumOdd:=iSumOdd + iDigit;
    end;
    iSum:=(iSumOdd*3) + iSumEven;
    iCheckSum:= ( 10 - ( iSum mod 10 ) );
  if ichecksum > 9 then
  Result := IntToStr(iCheckSum)[2] else
  Result := IntToStr(iCheckSum)[1];
end;


теперь все в порядке smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.