Module: Basho::CodeValidator

Defined in:
lib/basho/code_validator.rb

Overview

JIS X 0401 チェックディジットによる6桁自治体コードの検証。

Examples:

Basho::CodeValidator.valid?("131016") # => true
Basho::CodeValidator.valid?("131019") # => false

Constant Summary collapse

CHECK_DIGITS_INDEX =

チェックディジットの桁位置(0始まり)

5
CHECK_BASE =

モジュラス演算の基数

11
PREFECTURE_RANGE =

有効な都道府県コード範囲

(1..47)

Class Method Summary collapse

Class Method Details

.compute_check_digit(code) ⇒ Integer

チェックディジットを計算する。

Parameters:

  • code (String)

    6桁自治体コード

Returns:

  • (Integer)

    0〜9のチェックディジット



34
35
36
37
38
39
40
41
42
# File 'lib/basho/code_validator.rb', line 34

def compute_check_digit(code)
  sub_total = code.chars
                  .take(CHECK_DIGITS_INDEX)
                  .map.with_index { |digit, i| digit.to_i * (CHECK_DIGITS_INDEX - i + 1) }
                  .sum

  candidate = (CHECK_BASE - (sub_total % CHECK_BASE)) % 10
  sub_total >= CHECK_BASE ? candidate : CHECK_BASE - sub_total
end

.valid?(code) ⇒ Boolean

自治体コードの形式とチェックディジットを検証する。

Parameters:

  • code (String)

    6桁自治体コード

Returns:

  • (Boolean)


23
24
25
26
27
28
# File 'lib/basho/code_validator.rb', line 23

def valid?(code)
  return false unless code.is_a?(String) && code.match?(/\A\d{6}\z/)
  return false unless PREFECTURE_RANGE.cover?(code[0..1].to_i)

  code[CHECK_DIGITS_INDEX].to_i == compute_check_digit(code)
end