Class: Faker::Chinese::UniSocialCode
- Inherits:
-
Base
- Object
- Base
- Faker::Chinese::UniSocialCode
- Defined in:
- lib/faker_zextend/extend/chinese/uni_social_code.rb
Constant Summary collapse
- CHAR_VALUE =
统一社会信用代码最后一位:代码字符集
{ "0" => 0, "1" => 1, "2" => 2, "3" => 3, "4" => 4, "5" => 5, "6" => 6, "7" => 7, "8" => 8, "9" => 9, "A" => 10, "B" => 11, "C" => 12, "D" => 13, "E" => 14, "F" => 15, "G" => 16, "H" => 17, "J" => 18, "K" => 19, "L" => 20, "M" => 21, "N" => 22, "P" => 23, "Q" => 24, "R" => 25, "T" => 26, "U" => 27, "W" => 28, "X" => 29, "Y" => 30 }
- CHAR_RANGE =
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "T", "U", "W", "X", "Y"]
Class Method Summary collapse
-
.gen_org_code ⇒ Object
组织机构代码 9位.
-
.uni_social_code ⇒ Object
统一社会信用代码 18位.
Class Method Details
.gen_org_code ⇒ Object
组织机构代码 9位
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/faker_zextend/extend/chinese/uni_social_code.rb', line 25 def gen_org_code() weight_code = [3,7,9,10,5,8,4,2] # Wi 代表第i位上的加权因子=pow(3,i-1)%31 org_code = [] # 组织机构代码列表 sum = 0 for i in 0...8 index = rand(0..30) org_code << CHAR_RANGE[index] # 前八位本体代码:0~9 + A~Z 31个 sum = sum + index * weight_code[i] end c9 = 11-sum % 11 # 代表校验码:11-MOD(∑Ci(i=1→8)×Wi,11)-->前8位加权后与11取余,然后用11减 if c9 == 10 last_code = 'X' elsif c9 == 11 last_code = '0' else last_code = c9.to_s end org_code << last_code return org_code.join('') end |
.uni_social_code ⇒ Object
统一社会信用代码 18位
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/faker_zextend/extend/chinese/uni_social_code.rb', line 51 def () manage_code = [1, 5, 9] # 机构编制:1 民政:5 工商:9 其他:Y type_code = [1,2,3,9] # 9-1-企业,9-2-个体工商户,9-3-农民专业合作社,9-9-其他 area_code = '100000' # 登记管理机关行政区划码:100000-国家用 org_code = gen_org_code() # 组织机构代码 sum = 0 weight_code = [1, 3, 9, 27, 19, 26, 16, 17,20,29,25,13,8,24,10,30,28] # Wi 代表第i位上的加权因子=pow(3,i-1)%31 code = manage_code[rand(0...manage_code.count)].to_s + type_code[rand(0...type_code.count)].to_s + area_code + org_code 17.times do |i| sum = sum + CHAR_VALUE[code[i]] * weight_code[i] end c18 = CHAR_RANGE[31-(sum % 31 == 0 ? 31 : sum % 31)] # 校验位的mod值为0的时候,校验码的值为0 = code + c18 return end |