繁体   English   中英

字符串中的递增数字

[英]Increment number from a string

因此,我们为一位客户提供的一个项目允许他们打印支票。 支票上的字段之一是支票号。 当前,我们将支票号码(出于报告目的)以int类型存储在数据库中。

问题是客户希望将支票号码的大小增加到20位。 该项目的功能之一是在打印多张支票时自动为每张支票分配支票号码。

例如,他们正在打印3张支票。 他们输入起始支票号码为“ 100123”,然后在女巫点处单击“分配支票号码”按钮。要打印的第一张支票得到输入的“ 100123”,随后的每张支票都被赋予相同的号码,加一第二个检查将得到“ 100124”,第三个将得到“ 100125”,依此类推。

问题在于他们想要20位校验码,对于任何数字数据类型而言,校验码都太大。 我唯一的解决方案是将支票号更改为字符串/ varchar,但这会中断多次支票的“分配支票号”过程,因为我无法递增字符串以获取下一个号码。

关于如何实施此类要求的任何想法?

请使用BigIntegerdecimal ,因为两者的精度都超出了要求。

实际上, ulong的范围从018,446,744,073,709,551,615 ,即20位数字。 我假设不会有任何“负”支票号码。 只要支票的前两个数字小于17,您就可以这样做:

ulong checkNumber = ulong.Parse(textCheckNumber);
checkNumber++;
string newCheckNumber = checkNumber.ToString();

如果前两位数字有可能大于或等于17,则可以执行以下操作:

ulong checkNumber = ulong.Parse(textCheckNumber.SubString(2));
checkNumber++;
string newCheckNumber = textCheckNumber.SubString(0,2) + checkNumber;

您可以使用long 其最大值是2(^64)-1

感谢大家的反馈。

保存为varchar到数据库应该没问题。 这是我根据每个人的反馈想出的增量。

string sampleNum = "01999999999999999997";

for (int i = 0; i < 5; i++)
{
    int first = int.Parse(sampleNum.Substring(0, 2));
    ulong rest = ulong.Parse(sampleNum.Substring(2));

    rest++;
    if (rest > 999999999999999999)
    {
        first++;
        rest = 0;
    }

    sampleNum = first.ToString().PadLeft(2, '0') + rest.ToString().PadLeft(18, '0');

    Console.WriteLine(sampleNum);
}

这是我在测试中得到的:

01999999999999999998 
01999999999999999999 
02000000000000000000 
02000000000000000001 
02000000000000000002 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM