새소식

DEV/C++

JAN(Bar)Code 생성 QT Sample Source

  • -
728x90

JAN Code는 쉽게 말해서
일본에서 사용되는 바코드의 형태이다. (JAN 자체가 Japanese Article Numbering 의 약자)

 

바코드와 같이 각 Index별로 의미하는 값이 정해진다

(참조 :https://www.gs1jp.org/code/jan/procedure.html)

실제 구현 코드보면 글보다 더 쉽다..

#C++/QT 사용

#include <QString>
#include <QVector>
#include <QRegularExpression>

bool validateCode(const QString& code, int length)
{
    QRegularExpression regex("^[0-9]{" + QString::number(length) + "}$");
    QRegularExpressionMatch match = regex.match(code);
    return match.hasMatch();
}

bool validateManufacturerCode(const QString& manufacturerCode)
{
    // 제조사 코드의 유효성 검증
    return validateCode(manufacturerCode, 5);//(예: 5자리의 숫자)
}

bool validateProductCode(const QString& productCode)
{
    // 제품 코드의 유효성 검증 
    return validateCode(productCode, 5); //(예: 5자리의 숫자)
}

int calculateCheckDigit(const QString& number) {
    QVector<int> digits;

    for (QChar c : number) {
        digits.push_back(c.digitValue());
    }

    int oddSum = 0;
    int evenSum = 0;
    int total = 0;

    for (int i = 0; i < digits.size(); ++i) {
        if (i % 2 == 0) {
            oddSum += digits[i];
        }
        else {
            evenSum += digits[i];
        }
    }

    total = (oddSum * 3) + evenSum;
    int checkDigit = (10 - (total % 10)) % 10;

    return checkDigit;
}


QString generateJANCode(const QString& manufacturerCode, const QString& productCode) {
    QString countryCode = "49"; //일본 국가 코드
	//Code 순서 ( 국가코드 + 제조사코드 + 제품코드 )
    QString combinedCode = countryCode + manufacturerCode + productCode;
    int checkDigit = calculateCheckDigit(combinedCode);

    QString janCode = combinedCode + QString::number(checkDigit);
    return janCode;
}

bool checkJANCode(const QString& janCode) {
    QString reversedCode = janCode.mid(0, janCode.size() - 1);
    std::reverse(reversedCode.begin(), reversedCode.end());

    int oddSum = 0;
    int evenSum = 0;

    for (int i = 0; i < reversedCode.size(); ++i) {
        int digit = reversedCode[i].digitValue();

        if (i % 2 == 0) {
            oddSum += digit;
        }
        else {
            evenSum += digit;
        }
    }

    int total = (oddSum * 3) + evenSum;
    int checkDigit = (10 - (total % 10)) % 10;

    return checkDigit == janCode[janCode.size() - 1].digitValue();
}

bool MakeJanCode()
{
	QString manufacturerCode = "12345"; //제조사 코드
    if(!validateManufacturerCode(manufacturerCode))
    	return false;
    
    QString productCode = "00001"; //제품코드
    if(!validateProductCode(productCode))
    	return false;

	//Generate JanCode
    QString janCode = generateJANCode(manufacturerCode, productCode);

    // Print the JAN code
    qDebug() << "JANCode: " << janCode;

    bool res = checkJANCode(janCode);
    if (res) 
        qDebug() << "Success"; 
	else  qDebug() << "Fail"; 
}

 

일본에 판매하는 제품에 대한 코드 이기 때문에 
국가 코드는 일본 국가 코드인 49로 고정(45도 OK) 
판매 제품의 제조사 코드와  제품 코드값을 입력하여 최종 JAN Code 를 생성한다.

728x90
Contents

Copied the posting URL.

Please sympathize with me if this article was helpful.