質問するログイン新規登録
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

753閲覧

pythonによるJANコードのチェックディジット計算コードについて

Meteor

総合スコア18

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/13 14:37

編集2018/12/26 11:06

0

0

13桁のJANコードを生成するプログラムを作っているのですが、
13桁目のチェックディジットの計算が上手く動いていないようで。
13桁の数字が出力された場合は、計算が上手くいってるのですが、
たまに14ケタのコードが生成されてしまい原因がわかりません。

お知恵をお借りできれば幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

たとえば、product_id = 123456789005の時、途中のretの値が100になります。この結果、10という2桁の数字を返す不具合が発生しているのだと思います。

欲しい値は「10からretの下1桁の値を引いたもの、ただしretの下1桁が0の場合は0」だと思うので、以下のようにダイレクトに書いてしまった方が簡単だと思います。

python

1def get_jan_checkdigit(product_id): 2 # 前半は省略 3 ret = odd_digits_vals + (even_digits_vals * 3) 4 return (0, 9, 8, 7, 6, 5, 4, 3, 2, 1)[ret % 10]

以下はコメントを受けての追記です。

pythonではリストやタプルのようなシーケンス型のオブジェクトの後ろに[i]のように大括弧を書くことで(最初の要素を0番目として)i番目の要素を指すことができます。よって、以下のように書くことでretの下1桁の値に応じて狙った値をreturnすることができます。

retの下1桁の値returnされる値
00
19
28
......
91

python

1 table = (0, 9, 8, 7, 6, 5, 4, 3, 2, 1) 2 return table[ret % 10] 3

上の2行をさらにまとめると、以下の1行になります。

python

1 return (0, 9, 8, 7, 6, 5, 4, 3, 2, 1)[ret % 10]

投稿2018/11/13 15:37

編集2018/11/13 17:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Meteor

2018/11/13 16:15

ありがとうございます ご指摘の通りでした。 お聞きしたいのですが、 return (0, 9, 8, 7, 6, 5, 4, 3, 2, 1)[ret % 10] これは何を表しているのか理解ができませんでした。 ご教授いただけたら幸いです
Meteor

2018/11/14 05:39

ご丁寧に解説ありがとうござます 理解できました。
guest

0

python

1 ret = ret % 10 2 ret = 10 - ret 3 ret = ret % 10 4 return ret

投稿2018/11/13 15:18

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Meteor

2018/11/13 15:30

解決できました!ありがとうございます
guest

0

所々にprint文を入れて、変数の内容を表示させてみて、計算があってるかみてみればどうでしょうか

# この関数の戻り値が10以上になってないですか?

投稿2018/11/13 14:40

編集2018/11/13 14:42
y_waiwai

総合スコア88182

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Meteor

2018/11/13 14:55

ご回答感謝します。 私自身はほぼ素人で、このコードは依頼して作っていただきました。 よって、内容を詳しく理解仕切れていません。 戻り値は10以上になることがあります。 そのため、14桁が発生してしまうのかと
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問