用Java检验统一社会信用代码是否为真

统一社会信用代码简介

实施统一社会信用代码制度,是为每个公民、法人和其他组织发放一个唯一的、终身不变的主体标识代码,并以其为载体采集、查询、共享、比对各类主体信用信息,有利于促进信用信息资源共享,降低社会管理成本,提高公共服务水平,完善社会治理体系。

统一社会信用代码算法

第一步:取统一社会信用代码的前十七位为基数。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("统一社会信用代码校验");
    }

}

效果图

统一社会信用代码正确结果 展示

用Java检验统一社会信用代码是否为真_第1张图片

 

统一社会信用代码错误结果 展示

用Java检验统一社会信用代码是否为真_第2张图片

 

你可能感兴趣的:(java,开发语言)