C#底层库--万能进制转换器(自定义有序字符,支持任意进制)

系列文章

C#底层库–RegexHelper正则表达式辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/109745286

C#底层库–程序日志记录类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709

C#底层库–排序算法帮助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124495730

C#底层库–MySQL数据库访问操作辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379

C#底层库–SQLBuilder脚本构建类(select、insert、update、in SQL语句自动生成)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216

C#底层库–XML配置参数读写辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129175304

C#底层库–获取文件版本和MD5值
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

C#底层库–文件操作类(文件重命名、目录移动、字节流转换)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887161

C#底层库–Excel数据读取类(可读加密表格)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887445

C#底层库–随机数生成器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126888812

C#底层库–CSV和DataTable相互转换
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128804367

C#底层库–Image图片操作类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805298

C#底层库–JSON使用教程_详细(序列化、反序列化、转DataTable)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805705

C#底层库–cookie使用教程
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816347

C#底层库–Session操作辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817096

C#底层库–Image图片操作类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805298

C#底层库–图片增加水印辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817184

C#底层库–数据库类型与程序类型转换器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817610

C#底层库–StringExtension字符串扩展类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129520428

C#底层库–万能进制转换器(自定义有序字符,支持任意进制)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130444724

C#底层库–文件上传方法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817487

C#底层库–网络通信帮助类HTTP
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886697


前言

本专栏为【底层库】,主要介绍编程过程中 通用函数。我们将这些通用固化的源码,进行重写、封装、拓展,再进行单元测试、集成测试、beta测试,最终形成通用化模板,这里我们称为“底层库”。

作为研发人员的你,并不需要花大量时间,研究“底层库”的含义,及“底层库”的实现方法。你只需要几行调用代码,就可以解决项目上碰到的难题。而底层库使用方法,本专栏均有详细介绍,也有项目应用场景。

底层库已实现功能:MySQL脚本构建器、MySQL数据库访问操作、参数配置文件读写、加解密算法、日志记录、HTTP通信、Socket通信、API前后端交互、邮件发送、文件操作、配置参数存储、Excel导入导出、CSV和DataTable转换、压缩解压、自动编号、Session操作等。

本专栏会持续更新,不断优化【底层库】,大家有任何问题,可以私信我。本专栏之间关联性较强(我会使用到某些底层库,某些文章可能忽略介绍),如果您对本专栏感兴趣,欢迎关注,我将带你用最简洁的代码,实现最复杂的功能。

需求源自于工作,业务部门提出去除“0 和 O字符 ”,所以系统自带的进制转换方法,已经不再适用,我们需要自己开发底层库–自定义进制转换器,支持任意进制的转换。
在这里插入图片描述

在这里插入图片描述

一、底层库作用

用于顺序编号,复杂业务单据号生成,可以阅读《【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号)
在这里插入图片描述
作用:生成带顺序的编号,可以去除易混淆字符、不需要字符,比如说,数字0 和 字母O容易混淆,可以去除。计算机世界第一个数字从0开始,不符合人们习惯,可以去除0,从1开始计数。

二、底层库源码

创建数字转换类,ConvertNumber.cs,复制以下代码。

using System;
using System.Collections.Generic;
using System.Linq;

namespace DLQRLabel
{
    /// <summary>
    /// 自定义进制转换器,非系统Convert.ToString()方式
    /// 创建人:gyc
    /// 创建时间:2023-04-29
    /// 说明:用于顺序编号,业务单号可以阅读《【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号)】》
    /// 本文只适用于 123456789 这类,支持16进制、32进制,支持跳过容易混淆的字符。
    /// 使用过程中发现错误,请联系作者修改 https://blog.csdn.net/youcheng_ge。
    /// </summary>
    public class ConvertNumber
    {
        /// <summary>
        /// 属性:字符编号
        /// </summary>
        public string Characters
        {
            get;
            set;
        }


        /// <summary>
        ///属性:字符长度
        /// </summary>
        public int Length
        {
            get
            {
                if (Characters != null)
                    return Characters.Length;
                else
                    return 0;
            }
        }


        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="a_intDigit">进制位数(2进制、8进制、10进制、16进制、32进制)</param>
        public ConvertNumber(int a_intDigit)
        {
            switch (a_intDigit)
            {
                case 2:
                    Characters = "01";
                    break;

                case 8:
                    Characters = "01234567";
                    break;

                case 10:
                    Characters = "0123456789";
                    break;

                case 16:
                    Characters = "0123456789ABCDEF";
                    break;

                case 32:
                    Characters = "123456789ABCDEFGHJKLMNPQRSTVWXYZ";
                    break;

                default:
                    Characters = "0123456789";
                    break;
            }
        }


        /// <summary>
        /// 构造方法(根据字符长度,创建进制)
        /// </summary>
        /// <param name="characters">字符</param>
        public ConvertNumber(string characters)
        {
            Characters = characters;
        }



        /// <summary> 
        /// 数字序号转换为指定的进制形式字符串 
        /// </summary> 
        /// <param name="a_longNumber">数字序号</param> 
        /// <returns></returns> 
        public string ToString(long a_longNumber)
        {
            List<string> result = new List<string>();
            long t = a_longNumber;

            while (t > 0)
            {
                var mod = t % Length;
                t = Math.Abs(t / Length);
                var character = Characters[Convert.ToInt32(mod)].ToString();
                result.Insert(0, character);
            }

            return string.Join("", result.ToArray());
        }



        /// <summary>
        /// 指定字符串转换为指定进制的数字形式
        /// </summary>
        /// <param name="a_str">字符串</param>
        /// <returns></returns>
        public long FromString(string a_str)
        {
            long result = 0;
            int j = 0;
            //字符串按字符倒序分割
            foreach (var ch in a_str.ToCharArray().Reverse().ToArray())
            {
                if (Characters.Contains(ch))
                {
                    int index = Characters.IndexOf(ch); //所在位置
                    long baseNum = (long)Math.Pow(Length, j);//计算次方,进制*指数
                    result += index * baseNum;
                    j++;
                }
            }
            return result;
        }

    }
}


三、调用方法

3.1 指定字符串转换为指定进制的数字形式

ConvertNumber number = new ConvertNumber("123456789ABCDEFGHJKLMNPQRSTVWXYZ");
long l_intSN = number.FromString(l_strNo); //字符串转序号

3.2 数字序号转换为指定的进制形式字符串

ConvertNumber number = new ConvertNumber("123456789ABCDEFGHJKLMNPQRSTVWXYZ");
l_strNo = number.ToString(++l_intSN).PadLeft(4, '1');//序号+1 转字符串

四、项目样例

我这里从本地数据库,取得最大的编号,然后依次往后编号,确保生成的编号唯一,就是不重复。
界面元素:输入框–需要产生多少编号,按钮–执行编号生成,表格–数据展示。
在这里插入图片描述
在这里插入图片描述

五、资源链接

添加按钮代码如下,仅供大家参考,代码不完整。
使用的【底层库】,我已经封装在动态链接库 Geyc_Utils.dll 中。

private void BTN_Add_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(text_Num.Text))
                {
                    FrmTips.ShowTipsError(this, "请正确填写每批数量!");
                    return;
                }

                //清空数据
                richTextBox1.Clear();
                m_listMain.Clear();

                int l_intBatchNum = Convert.ToInt32(text_Num.Text);//每批数量

                ConvertNumber number = new ConvertNumber("123456789ABCDEFGHJKLMNPQRSTVWXYZ");

                string str_MAX = DBService.GetMaxNo();
                long l_intSN = 0;

                if (string.IsNullOrEmpty(str_MAX))
                {
                    str_MAX = "1111";
                }

                string l_strOutput = string.Empty;
                string l_strNo = str_MAX;
                l_intSN = number.FromString(l_strNo); //字符串转序号

                for (int i = 0; i < l_intBatchNum; i++)
                {
                    if (l_intSN == 0) //初始化为0;
                    {
                        l_strNo = "1111";
                        l_intSN = 1;
                    }
                    else
                    {
                        l_intSN = number.FromString(l_strNo); //字符串转序号
                        l_strNo = number.ToString(++l_intSN).PadLeft(4, '1');//序号+1 转字符串
                    }

                    PrintModel model = new PrintModel();
                    model.supply_no = text_supply.Text;
                    model.code_no = l_strNo;
                    model.date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    m_listMain.Add(model);

                }

                for (int i = 0; i < m_listMain.Count; i++)
                {
                    l_strOutput = l_strOutput + m_listMain[i].supply_no + "\t" +
                                    m_listMain[i].code_no + "\t" +
                                    m_listMain[i].date + "\t" +
                                    "\n";
                }
                richTextBox1.AppendText(l_strOutput);

            }
            catch (Exception ex)
            {
                FrmTips.ShowTipsError(this, "程序出错:" + ex.Message);
            }
            finally
            {
                AppConfig.SetValue("batch_num", text_Num.Text.Trim());
                AppConfig.SetValue("supply_no", text_supply.Text.Trim());
            }
        }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花北城

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值