C#底层库--自定义进制转换器(可去除特殊字符,非Convert.ToString方式)

news2024/11/24 22:42:03

系列文章

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

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

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

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

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

C#底层库–FilesHelper文件辅助类(删除目录文件、复制文件到指定目录)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887161

C#底层库–Excel操作帮助库(可读加密Excel表格)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887445

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

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

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/128817610

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

文章目录

  • 系列文章
  • 前言
  • 一、底层库作用
  • 二、底层库源码
  • 三、调用方法
    • 3.1 指定字符串转换为指定进制的数字形式
    • 3.2 数字序号转换为指定的进制形式字符串
  • 四、项目样例
  • 五、资源链接


前言

本专栏为【底层库】,主要介绍编程过程中 通用函数。我们将这些通用固化的源码,进行重写、封装、拓展,再进行单元测试、集成测试、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());
            }
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/476910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从南极到你家,易开得,一支“中国芯”的奇幻漂流

2023年的AWE&#xff0c;精彩程度比我想象中还要夸张&#xff01; 一方面是热度空前&#xff0c;现场人头攒动&#xff0c;有一家老中幼三代一起来观展的&#xff0c;有经销商、客户来问价采购的&#xff0c;还有行业媒体举着单反、手机、摄像机激情拍照的&#xff0c;让我们正…

4月30日第壹简报,星期日,农历三月十一

4月30日第壹简报&#xff0c;星期日&#xff0c;农历三月十一坚持阅读&#xff0c;静待花开1. 五一小长假首日全国铁路迎客流高峰&#xff0c;创铁路单日客流历史新高&#xff0c;旅游订单量较春节假期首日增长668%。2. 六大国有银行一季报业绩披露&#xff1a;共赚近3600亿元&…

chatgpt 数据相关应用论文策略简介

hatGPT等预训练大模型&#xff0c;一个核心能力就是经过海量语料的训练加上强化学习的引导&#xff0c;其具有强大的接近人类的文本生成能力。这个能力的一大用途&#xff0c;就是可以为我们生产数据或者标注数据&#xff0c;再基于这些数据训练我们自己的模型。 On the Feasi…

B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能

B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能 文章目录 B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能每博一文案1. Cookie 的概述2. session 与 Cookie 之间的联系&#xff1a;3. Cookie 的作用&#xff…

Android 9.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(一)

1.前言 在9.0的系统rom产品定制化开发中,在原生系统SystemUI下拉状态栏的通知栏的通知背景默认是白色四角的背景, 由于在产品设计中,需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 然后通知显示流程,设置默认下拉状态栏UI中的…

LaTeX基础文本排版命令

LaTeX基础文本排版命令 1. 字体大小2. 字体的粗体与斜体2.1. 粗体2.2 斜体2.3 同时启用粗体和斜体 3. 空格长度4. 高度与宽度尺寸 在LaTeX中&#xff0c;文本排版可以通过简单的命令实现&#xff0c;这些命令可以控制字体大小、粗体与斜体、空格、行高和宽度等方面&#xff0c;…

【C++】模板进阶:非类型模板参数模板的特化模板分离编译

文章目录 1. 非类型模板参数2. 模板的特化1. 概念2. 函数模板特化3.类模板特化 3. 模板分离编译4. 模板总结 在之前的博客中我们初次接触到了泛型编程和模板的概念 【C】模板初阶&#xff0c;当时只讲了一些基本的用法&#xff0c;现在做一些补充 1. 非类型模板参数 模板参数…

js判断是否为null,undefined,NaN,空串或者空对象

js判断是否为null&#xff0c;undefined&#xff0c;NaN&#xff0c;空串或者空对象 这里写目录标题 js判断是否为null&#xff0c;undefined&#xff0c;NaN&#xff0c;空串或者空对象特殊值nullundefinedNaN空字符串&#xff08;""&#xff09;空对象&#xff08;…

【Linux】4. 开发工具的使用(yum/vim)

前言 工具的本质就是指令 在介绍工具之前先介绍一下互联网生态 Linux 软件包管理器 yum 1. 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以…

【算法】一文彻底搞懂ZAB算法

文章目录 什么是ZAB 算法&#xff1f;深入ZAB算法1. 消息广播两阶段提交ZAB消息广播过程 2. 崩溃恢复选举参数选举流程 ZAB算法需要解决的两大问题1. 已经被处理的消息不能丢2. 被丢弃的消息不能再次出现 最近需要设计一个分布式系统&#xff0c;需要一个中间件来存储共享的信息…

手把手教你开发第一个HarmonyOS (鸿蒙)移动应用

⼀、移动应⽤开发的介绍 移动应⽤开发: AndroidIOSHarmonyOS &#xff08;鸿蒙&#xff09; ⼆、HarmonyOS介绍 文档概览-HarmonyOS应用开发官网 2.1 系统的定义 2.1.1 系统的定位 HarmonyOS有三⼤特征&#xff1a; 搭载该操作系统的设备在系统层⾯融为⼀体、形成超级终…

常见元件、封装、尺寸、表面处理等

参考&#xff1a;https://www.bilibili.com/read/cv11024927?fromsearch&spm_id_from333.337.0.0 参考&#xff1a;https://www.bilibili.com/read/cv18413169?fromsearch&spm_id_from333.337.0.0 目录 通孔插件(THT)和表面贴装(SMT)技术封装类型SOP/SOIC封装DIP封装…

实战打靶集锦-018-decoy

提示&#xff1a;本文记录了博主的一次打靶过程 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 浏览器探查 5. 突破边界6. 提权6.1 rbash绕过6.2 枚举系统信息6.3 枚举定时任务6.4 枚举可执行文件 7. 获取flag 1. 主机发现 目前只知道目标靶机在65.xx网段&#xff0c…

thinkphp6数据库操作

文章目录 数据库链接 查询构造器查询 添加修改删除链式操作链式操作wheretablefieldpageodrderjoincache 聚合查询分页查询 数据库 链接 在config下有个database.php文件&#xff0c;一般情况下我们配置这个文件即可 return [default > mysql,connections > …

学习记录:2023.4.27

2023.4.27 实习学习记录 Vue连接远程数据库Java基础 Vue cursor: pointer; 表示鼠标指针在该元素上时会变成手形&#xff0c;表示该元素可以被点击或者有交互性。这是一种CSS样式属性&#xff0c;常用于网页设计中。VueECharts实现热词图&#xff1a; 1、安装依赖&#xff1a;…

Linux命令集(Linux常用命令--cat指令篇)

Linux命令集&#xff08;Linux常用命令--cat指令篇&#xff09; Linux常用命令集&#xff08;cat指令篇&#xff09;4.cat(concatenate)1. 查看文件内容&#xff1a;2. 连接多个文件&#xff1a;3. 创建文件并通过终端写入内容4. 输出内容编号 Linux常用命令集&#xff08;cat指…

操作系统概述

概述 一、简单描述 1、系统资源的管理者&#xff1b; 2、最接近硬件的一层软件&#xff1b; 3、向上层提供方便容易使用的服务&#xff1b; 二、提供的功能 1、处理机管理&#xff1b; 2、储存器管理&#xff1b; 3、文件管理&#xff1b; 4、设备管理&#xff1b; 举例说明…

Redis学习——day01

Redis学习基础 Nosql&#xff1a;Redis入门&#xff1a;Redis安装&#xff1a;Windows&#xff1a;Linux安装&#xff1a; Nosql&#xff1a; Nosql Not Only Sql&#xff08;不仅仅Sql&#xff09;NoSQL&#xff0c;泛指非关系型的数据库。随着互联网web2.0网站的兴起&#…

了解 AlphaFold2 论文必备知识,不会有人还不知道吧

你知道 AlphaFold2 吗&#xff1f;它真正解决了蛋白质三维结构预测的算法困境&#xff0c;堪称蛋白质界的 chat-GPT4&#xff0c;甚至它的意义不是 chat-GPT4 所能够匹敌的。它为世界疾病治疗药物开发以及探究生物生命之谜提供了通向天神的一条道路&#xff0c;未来是生物的世纪…

深入与浅谈 Vue 中计算属性和侦听器的区别和使用(Vue3版本为例)

#五一技术创作马拉松# &#x1f4cb;前言 计算属性 computed 和侦听器 watch 都是 Vue.js 框架中用来响应式更新视图的重要概念。在 Vue 项目开发中&#xff0c;这两个技术点是非常重要的&#xff0c;同时也是 Vue 基础中不可缺少的知识点。在面试中&#xff0c;计算属性 comp…