【问题标题】:Trying to understand strange string concatenation behavior试图理解奇怪的字符串连接行为
【发布时间】:2016-12-26 23:03:59
【问题描述】:

我有一个非常简单的方法,它接受一个字符串,将其分解为一个 char 数组,然后从这些片段中创建一个新字符串。但是它的表现出乎意料,我不明白为什么?这是断点的图片。本例中的输入字符串为“20160622”。

编辑:抱歉图片。这是文本中的问题。

    internal class Program
    {
        private static void Main()
        {
            string test = "20160622";
            Console.WriteLine(ConvertDateField(test));
            Console.ReadKey();
        }

        private static string ConvertDateField(string date)
        {
            var temp = date.ToCharArray();
            var output = temp[0] + temp[1] + temp[2] + temp[3] + "-" + temp[4] + temp[5] + "-" + temp[6] + temp[7] + " 00:00:00";

            return output;
        }
    }

输出是“201-06-22 00:00:00”。

编辑 2:我知道可能有更好的方法来做到这一点。我试图理解的是为什么这段代码会以它的方式运行。 IE。为什么 6 是唯一未连接的字符?

如您所见,第四个字符 temp[3] 是一个 '6',并没有被连接到输出字符串中。为什么?

编辑 3:我这样解决了问题

    private static string ConvertDateField(string date)
    {
        return DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd 00:00:00");
    }

感谢史蒂夫的建议。

【问题讨论】:

  • 请张贴minimal reproducible example 的代码并输出为文本,而不是屏幕截图。但从根本上说,听起来您可能应该解析该值并重新格式化它。
  • 似乎是一种非常奇怪和糟糕的日期格式化方式。使用带有格式字符串的 DateTime.TryParse 将日期解析为 DateTime 对象,然后使用带有格式字符串的 ToString() 以您想要的方式输出。
  • 所有反对票是怎么回事。我不明白。如果没有在调试器中实际尝试,我无法找出问题所在。初学者不用多说。
  • 我怀疑否决票与提问的方式(图像而不是代码等)有关,而不是与问题本身有关。
  • 乍一看,您只提供了一个屏幕截图,而且看起来不像人们回答这类问题通常所需的信息量。但是考虑到投票的答案,您显示的功能代码以及给定的输入就足够了。如果您将代码作为文本(在代码块中)包含在内会更好,这样人们就可以自己快速试用您的代码。

标签: c# string debugging char concatenation


【解决方案1】:

对于您的问题。 char concat 不是字符串 concat。发生的事情是 c# 通过将字符转换为带有 ASCII 的 int 来对字符进行数学运算。

temp 1、2、3、4对应的ascii是50、48、49、54,总和是201。(真是巧合)

然后int + string concat 产生字符串,因此字符串的其余部分按预期工作。

如果它是 DateTime 对象,则有一种更简单的方法来执行转换。您只需拨打dateTime.ToString("yyyy-MM-dd 00:00:00") 即可获得您想要的结果。

【讨论】:

  • 好消息,多么令人误解的巧合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
相关资源
最近更新 更多