系列文章
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());
}
}