C#substring缺少第一个零值

时间:2016-06-08 20:03:11

标签: c# substring

我有一个字符串日期,我想分成整数:年,月和日。 例如,20160622应返回year = 2016,month = 06和day = 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

6 个答案:

答案 0 :(得分:5)

使用Int32.Parse后,该值为整数,而整数不具有前导数字。 "06"只变为6。

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

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

ToString("00")告诉C#将int转换回字符串,但将其渲染为两位数(如果需要,前导为0)。

这是尝试它的小提琴:fiddle

答案 1 :(得分:4)

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

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

然后,当您尝试显示每个部分时,可以使用Date format strings

答案 2 :(得分:1)

如果您需要的是" 06"的文本值,则只需解析返回的值作为整数。将它们保存为您需要的字符串。如果此后需要它们作为int,则解析字符串值并稍后使用int。

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

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

答案 3 :(得分:0)

当您解析为int时,您将失去领先的0

解决方案#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();

答案 4 :(得分:0)

使用格式说明符

指定填充

当你使用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

答案 5 :(得分:0)

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()

尝试此操作