【问题标题】:C#: Increment invoice number based on set cyclesC#:根据设定的周期增加发票编号
【发布时间】:2021-10-26 13:38:06
【问题描述】:

我正在创建递增的发票编号,如下所示:AABBBB1122

'A' 和 'B' 绑定到我的代码中的标识符。 但我需要分别为 monthyear 的数字。 例如:0821(2021 年 8 月)。 我不想以任何方式将它连接到日历。 如果可能的话,我想定义一个开始日期,并从那里递增。

即:0821 必须递增到 09211021 11211221 - 在年份也增加之前; 0122

我该怎么做?

到目前为止我的收获:

string AA {
    get { return this.IdentifierA.Substring(0, 2);
    set { SetAndNotify(ref this.AA, value); }
}

string BB {
    get { return this.IdentifierB.Substring(0, 4);
    set { SetAndNotify(ref this.BB, value); }
}

string InvoiceNumber {
   get { return String.Concat(AA + BB + /* what goes here? */).ToUpper(); }
   set { SetAndNotify(ref this.InvoiceNumber, value);

【问题讨论】:

  • 澄清什么是问题。因为如果你已经存储了开始日期,或者你有计算这个的函数,你就可以连接起来。
  • 为什么不使用DateTime d = new DateTime(2021, 08, 26); 来设置你的日期,然后像d.ToString("MMyy") 这样格式化它。
  • 如果你想使用月份和年份,你必须在你的类中放入一些 DateTime 对象来保存所需的时间点。在您的代码中,您可以编写类似 this.PointInTime.ToString("MMyy") 的内容

标签: c# string-concatenation


【解决方案1】:

听起来像是一种特殊的发票编号方式。您是说根据当前日期想要它,但只是增加 MMYY 风格?

给定一个典型的自动增量 int KEY,每张发票都会增加 1,请使用:

((KEY % 12).ToString("00")+(KEY/12).ToString("00"))

12*21+8 开始 KEY 以 0821 开始。

.. 但是根据发票要求,我认为您肯定要求的是:

(DateTime.Now.Month.ToString("00")+DateTime.Now.Year.ToString("00"))

【讨论】:

  • picky:只调用一次 DateTime.Now 以避免在边界上得到不同的答案:2021-12-31 + 2022-01-01 = 1222
  • @Chris Kuliukas,我这样做的原因是发票可能不会在同一个月发出。可能是前一天或后一天发出的,所以数字是错误的。可能是有点奇葩吧。感谢您为我提供了两种解决此问题的方法。赞赏!
  • @AmyB,感谢您的评论 - 您能给我举个例子,我可以如何重构代码行以考虑到这一点吗?
  • @Chris Kuliukas,我还必须使用 Substring() 来划分 DateTime 的年份部分,因为它给了我所有四位数(可能是区域性的)。再次感谢。
  • 当然@OleM,我会将 DateTime.Now 放入局部变量,然后在表达式中引用局部变量。
【解决方案2】:

这将是:

return string.Format("{0}{1}{2}", AA, BB, DateTime.Now.ToString("MMyy")).ToUpper();

或在新的串联中

return $"{AA}{BB}{DateTime.Now.ToString("MMyy")}".ToUpper();

【讨论】:

    【解决方案3】:

    如果我正确理解了您的问题,目标是从字符串中解析日期并生成下一个 id。然后,您可以使用以下逻辑。

    string id = "AAAA1221";
    
    // Extract data.
    int i = Convert.ToInt32(id.Substring(id.Length - 4, 4));
    int year = i % 100;
    int month = i / 100;
    
    // Perform increment logic.
    if (month == 12)
    {
        year++;
        month = 1;
    }
    else
    {
        month++;
    }
    
    // Reformat key
    string newId = $"{id.Substring(0, id.Length - 4)}{month:D2}{year:D2}";
    

    如果您不想使用之前的 id,您可以使用之前在 'i' 变量中的值启动相同的逻辑。

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2012-02-23
      • 1970-01-01
      • 2012-08-11
      • 2015-08-28
      相关资源
      最近更新 更多