【问题标题】:C# substring missing first zero valueC# 子字符串缺少第一个零值
【发布时间】:2016-06-08 20:03:11
【问题描述】:

我有一个字符串日期,我想将其拆分为整数:年、月和日。 例如,20160622 应该返回年 = 2016,月 = 06 和日 = 22。代码如下:

        String dateString = "20160622";
        int year = Int32.Parse(dateString.Substring(0, 4));
        Console.WriteLine("year is " +year);
        Console.ReadKey();

        int month = Int32.Parse(dateString.Substring(4, 2));
        Console.WriteLine("month is " + month);
        Console.ReadKey();

        int jour = Int32.Parse(dateString.Substring(6, 2));
        Console.WriteLine("day is  " + jour);
        Console.ReadKey();

当子字符串的第一个字符为 '0' 时,它不会作为子字符串的一部分返回。我得到以下输出:

year is 2016
month is 6
day is 22

但我想得到

year is 2016
month is 06
day is 22

【问题讨论】:

  • 前导零只存在于字符串中。由于您将其解析为int,因此您需要将它们添加回来。为此,您可以使用format string
  • 06 不再是 int
  • 更不用说0809,它们是全新的蠕虫罐头。
  • 只是不要将它们解析为整数,你就会得到你需要的。
  • @ManoDestra 你是对的;我忽略了Substring 电话。

标签: c# substring


【解决方案1】:

一旦你使用Int32.Parse,它的值就是一个整数,并且整数没有前导数字。 "06" 变成了 6 个。

如果要打印带有前导数字的值,可以在再次将整数写入字符串时提供自定义格式:

Console.WriteLine("month is " + month.ToString("00"));

ToString("00") 告诉 C# 将 int 转换回字符串,但将其呈现为两位数(必要时以 0 开头)。

这里有一个小提琴来试试看:fiddle

【讨论】:

  • 我手边没有 C# 编译器,但 month.ToString("00") 也可以吗?
【解决方案2】:

如果您尝试从字符串中解析日期,您应该使用DateTime.ParseExact

var str = "20160622";
var date = DateTime.ParseExact(str, "yyyyMMdd", CultureInfo.InvariantCulture);

然后,当您尝试展示每一件作品时,您可以使用Date format strings

【讨论】:

  • 更好的是,使用TryParseExact 方法,以避免出现无效字符串输入的异常
  • 只要您处理 TryParseExact 返回“false”的条件。我见过太多开发人员只是调用“TryParse”并忽略返回结果,因为它“防止错误”。
【解决方案3】:

如果您需要的是“06”的文本值,那么就不要将返回的值解析为整数。将它们保留为您需要的字符串。如果之后您需要它们作为整数,则解析字符串值并稍后使用整数。

string month = dateString.Substring(4, 2);

假设:您提供的日期格式字符串是一致的。如果该日期格式发生变化,那么您当然必须以不同的方式对其进行解析。

【讨论】:

    【解决方案4】:

    当您解析为 int 时,您会丢失前导的 0s。

    解决方案 #1:不要解析为 int:

        String dateString = "20160622";
        string year = dateString.Substring(0, 4);
        Console.WriteLine("year is " +year);
        Console.ReadKey();
    
        string month = dateString.Substring(4, 2);
        Console.WriteLine("month is " + month);
        Console.ReadKey();
    
        string jour = dateString.Substring(6, 2); // i think you mean `day`
        Console.WriteLine("day is  " + jour);
        Console.ReadKey();
    

    解决方案 #2:使用前导 0 格式化解析的 int

        String dateString = "20160622";
        int year = Int32.Parse(dateString.Substring(0, 4));
        Console.WriteLine("year is " +year.ToString("D4"));
        Console.ReadKey();
    
        int month = Int32.Parse(dateString.Substring(4, 2));
        Console.WriteLine("month is " + month.ToString("D2"));
        Console.ReadKey();
    
        int jour = Int32.Parse(dateString.Substring(6, 2));
        Console.WriteLine("day is  " + jour.ToString("D2"));
        Console.ReadKey();
    

    【讨论】:

      【解决方案5】:
      String dateString = "20160622";
          int year = Int32.Parse(dateString.Substring(0, 4));
          Console.WriteLine("year is " + year.ToString("D4"));
          Console.ReadKey();
      
          int month = Int32.Parse(dateString.Substring(4, 2));
          Console.WriteLine("month is " + month.ToString("D2"));
          Console.ReadKey();
      
          int jour = Int32.Parse(dateString.Substring(6, 2));
          Console.WriteLine("day is  " + jour.ToString("D2"));
          Console.ReadKey();
      

      用 ToString() 试试这个

      【讨论】:

        【解决方案6】:

        使用格式说明符指定填充

        当您使用 parse 方法时,它会使用字符串中表示的值创建一个新的 int,然后将其连接起来只会给您 "6" 而没有前导 0

        您可以通过以下方式为此使用字符串格式说明符

            int month = Int32.Parse(dateString.Substring(4, 2));
        
            //using Console.WriteLine's overload
            Console.WriteLine("month is {0:D2}", month);
        
            //using string.Format
            Console.WriteLine(string.Format("month is {0:D2}",month))
        
            //using string interpolation 
            Console.WriteLine($"month is {month:D2}");
        
            //using the ToString method of the int
            Console.WriteLine("month is "+ month.ToString("D2"));
        

        “D2”是什么意思

        D 代表十进制,2 代表应该打印的最小位数

        有关格式化 int 的其他方式的更多信息,您可以查看msdn page about it

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-20
          • 2014-07-20
          • 2016-05-28
          • 1970-01-01
          • 2014-11-04
          • 1970-01-01
          • 1970-01-01
          • 2017-10-25
          相关资源
          最近更新 更多