统一社会信用代码简介
实施统一社会信用代码制度,是为每个公民、法人和其他组织发放一个唯一的、终身不变的主体标识代码,并以其为载体采集、查询、共享、比对各类主体信用信息,有利于促进信用信息资源共享,降低社会管理成本,提高公共服务水平,完善社会治理体系。
统一社会信用代码算法
第一步:取统一社会信用代码的前十七位为基数。9 1 5 1 2 0 8 1 21 10 6 2 19 0 2 6 0提示:如果前十七位统一社会信用代码含有英文大写字母(不使用I、O、Z、S、V这五个英文字母)。则英文字母对应的基数分别为: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
第二步:取加权因子数值。因为统一社会信用代码前面前面有十七位字符。则这十七位的加权因子数值从左到右分别是:1、3、9、27、19、26、16、17、20、29、25、13、8、24、10、30、28
第三步:基数与对应位数的因子数值相乘。9×1=9,1×3=3,5×9=45,1×27=27,2×19=38,0×26=0,8×16=1281×17=17,21×20=420,10×29=290,6×25=150,2×13=26,19×8=1520×23=0,2×10=20,6×30=180,0×28=0
第四步:将乘积求和相加。9+3+45+27+38+0+128+17+420+290+150+26+152+0+20+180+0=1495
第五步:将和数除以31,求余数。1495÷31=48,余数是17。
第六步:用阿拉伯数字31减去余数,得求校验码的数值。当校验码的数值为0~9时,就直接用该校验码的数值作为最终的统一社会信用代码的校验码;如果校验码的数值是10~30,则校验码转换为对应的大写英文字母。对应关系为: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
主体代码实现
package com.creditcode;
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.border.*;
/**
* @author unknown
*/
public class CreditCode extends JFrame {
public CreditCode(String title) {
super(title);
initComponents();
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
// Generated using JFormDesigner Evaluation license - unknown
dialogPane = new JPanel();
contentPanel = new JPanel();
label1 = new JLabel();
textField1 = new JTextField();
label2 = new JLabel();
scrollPane1 = new JScrollPane();
textArea1 = new JTextArea();
buttonBar = new JPanel();
okButton = new JButton();
//======== this ========
var contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
//======== dialogPane ========
{
dialogPane.setBorder(new EmptyBorder(12, 12, 12, 12));
dialogPane.setLayout(new BorderLayout());
//======== contentPanel ========
{
contentPanel.setLayout(new GridBagLayout());
((GridBagLayout) contentPanel.getLayout()).columnWidths = new int[]{0, 0, 0, 0};
((GridBagLayout) contentPanel.getLayout()).rowHeights = new int[]{0, 0, 0, 0};
((GridBagLayout) contentPanel.getLayout()).columnWeights = new double[]{0.0, 0.0, 0.0, 1.0E-4};
((GridBagLayout) contentPanel.getLayout()).rowWeights = new double[]{0.0, 0.0, 0.0, 1.0E-4};
//---- label1 ----
label1.setText("\u7edf\u4e00\u793e\u4f1a\u4fe1\u7528\u4ee3\u7801\uff1a");
contentPanel.add(label1, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 5, 5), 0, 0));
contentPanel.add(textField1, new GridBagConstraints(2, 0, 1, 1, 5.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 5, 0), 0, 0));
//---- label2 ----
label2.setText("\u5224\u65ad\uff1a");
contentPanel.add(label2, new GridBagConstraints(0, 1, 2, 2, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 5), 0, 0));
//======== scrollPane1 ========
{
scrollPane1.setViewportView(textArea1);
}
contentPanel.add(scrollPane1, new GridBagConstraints(2, 1, 1, 2, 0.0, 4.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
dialogPane.add(contentPanel, BorderLayout.CENTER);
//======== buttonBar ========
{
buttonBar.setBorder(new EmptyBorder(12, 0, 0, 0));
buttonBar.setLayout(new GridBagLayout());
((GridBagLayout) buttonBar.getLayout()).columnWidths = new int[]{0, 80};
((GridBagLayout) buttonBar.getLayout()).columnWeights = new double[]{1.0, 0.0};
//---- okButton ----
okButton.setText("OK");
okButton.addActionListener(this::checkCardNum);
buttonBar.add(okButton, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
dialogPane.add(buttonBar, BorderLayout.SOUTH);
}
setLocationRelativeTo(null);
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane.add(dialogPane, BorderLayout.CENTER);
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
/**
* 实现 统一社会信用代码 的校验
*
* @param actionEvent
*/
private void checkCardNum(ActionEvent actionEvent) {
// 获取 用户 输入的统一社会信用代码
String cardNum = textField1.getText();
// 如果 没有输入统一社会信用代码
if ("".equals(cardNum)) {
textArea1.setText("");
return;
}
// 判断 长度 是否是 18 位
if (cardNum.length() != 18) {
textArea1.setText("统一社会信用代码%s不正确、期待18位、实际上长度为%d位".formatted(cardNum, cardNum.length()));
return;
}
// 调用 统一社会信用代码 算法、校验 统一社会信用代码 是否合法
if (checkCard(cardNum)) { // 如果统一社会信用代码校验成功
textArea1.setText("统一社会信用代码是真的");
return;
}
// 如果 校验失败
textArea1.setText("统一社会信用代码是假的");
}
private static int[] w = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
public static int base(char cardNum) {
return switch (cardNum) {
case 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' -> cardNum - 55;
case 'J', 'K', 'L', 'M', 'N' -> cardNum - 56;
case 'P', 'Q', 'R' -> cardNum - 57;
case 'T', 'U' -> cardNum - 58;
case 'W', 'X', 'Y' -> cardNum - 59;
case 'I', 'O', 's', 'v', 'z' -> {
throw new RuntimeException("无法将对应字符" + cardNum + "转成数字");
}
default -> cardNum - 48;
};
}
/**
* 用来校验 统一社会信用代码 的真假
*
* @param cardNum
* @return
*/
public static boolean checkCard(String cardNum) {
if (cardNum.length() != 18) return false;
int sum = 0;
for (int i = 0; i < w.length; i++) {
sum += w[i] * base(cardNum.charAt(i));
}
// 用31 减去 ( 和 31 进行 求余 )
int index = (31 - (sum % 31));
return index == base(cardNum.charAt(17));
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
// Generated using JFormDesigner Evaluation license - unknown
private JPanel dialogPane;
private JPanel contentPanel;
private JLabel label1;
private JTextField textField1;
private JLabel label2;
private JScrollPane scrollPane1;
private JTextArea textArea1;
private JPanel buttonBar;
private JButton okButton;
// JFormDesigner - End of variables declaration //GEN-END:variables
}
调用方法
package com.creditcode;
public class CreditCodeText {
public static void main(String[] args) {
new CreditCode("统一社会信用代码校验");
}
}
效果图
统一社会信用代码正确结果 展示
统一社会信用代码错误结果 展示