首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较惯用的计算GS1校验位的方法

比较惯用的计算GS1校验位的方法
EN

Stack Overflow用户
提问于 2013-07-29 10:34:57
回答 2查看 614关注 0票数 3

我正在试图计算一个GS1校验数字,并提出了以下代码。计算校验数字的算法是:

  1. 倒转条形码
  2. 删除最后一个数字(计算出的检查数字)
  3. 将数字与第一、第三、第五、第三、第五等数字相加。数字乘以3,偶数数字乘以1。
  4. 从最接近的等于或高于10的倍数减去之和。

这听起来很简单,但我想出的解决方案似乎有点不雅。它确实有效,但我想知道是否有一种更优雅的方式来写这篇文章。

代码语言:javascript
复制
(defn abs "(abs n) is the absolute value of n" [n]
  (cond
   (not (number? n)) (throw (IllegalArgumentException.
                 "abs requires a number"))
   (neg? n) (- n)
   :else n))

(defn sum-seq "adds (first number times 3) with (second number)"
  [coll]
  (+ 
   (* (first coll) 3)
   (second coll)))

(defn sum-digit
  [s]
  (reduce +
  (map sum-seq
  (partition 2 2 '(0) 
  (map #(Integer/parseInt %)
  (drop 2 (clojure.string/split (clojure.string/reverse s) #"")))))))

(defn mod-higher10 "Subtracts the sum from nearest equal or higher multiple of ten"
  [i]
  (if (zero? (rem i 10))
    0
    (- 10(rem i 10))))

(defn check-digit "calculates a GS1 check digit"
  [s]
  (mod-higher10 
   (sum-digit s)))

(= (check-digit "7311518182472") 2)
(= (check-digit "7311518152284") 4)
(= (check-digit "7311518225261") 1)
(= (check-digit "7311518241452") 2)
(= (check-digit "7311518034399") 9)
(= (check-digit "7311518005955") 5)
(= (check-digit "7311518263393") 3)
(= (check-digit "7311518240943") 3)
(= (check-digit "00000012345687") 7)
(= (check-digit "012345670") 0)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-29 11:18:33

代码语言:javascript
复制
(defn check-digit 
  [s] 
  (let [digits        (map #(Integer/parseInt (str %)) s)
        [chk & body]  (reverse digits)
        sum           (apply + (map * body (cycle [3 1])))
        moddiff       (mod (- 10 sum) 10)]
       moddiff))  

这个实现使用了我意识到的两个clojure习惯用法:

  • 管理局部分解(和重用)的let
  • map具有第二个集合,是一个与问题“相邻”的无限懒序列。

另外,取消结构列表,这样可以很容易地将检查谓词写成(= moddiff chk)

票数 6
EN

Stack Overflow用户

发布于 2013-07-29 21:59:42

线程宏-> ->>非常擅长链接函数应用程序。

(S为-位)

代码语言:javascript
复制
(defn check-digit [string]
 (->> string
   to-digits
   reverse rest
   (map * (cycle [3 1]) )
   (apply +)
   (- 10)
   (#(mod % 10))
   ))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17921814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档