【问题标题】:Can't figure out what this SubString.PadLeft is doing无法弄清楚这个 SubString.PadLeft 在做什么
【发布时间】:2008-09-19 21:19:53
【问题描述】:

在我正在调试的这段代码中,我有这段代码:

ddlExpYear.SelectedItem.Value.Substring(2).PadLeft(2, '0');

这会返回什么?我真的不能运行太多,因为它是实时信用卡应用程序的一部分。您可以从名称中想象的 DropDownList 包含 4 位数的年份。

更新:谢谢大家。我没有做很多 .NET 开发,所以设置快速测试对我来说不是那么快。

【问题讨论】:

  • 您是否尝试在控制台应用或类似应用中运行此代码?

标签: c# substring padleft


【解决方案1】:

它采用年份的最后两位数字,并用零填充左侧,最多为 2 个字符。看起来像是以 08、07 等结尾的到期年份的“以防万一”,确保出现前导零。

【讨论】:

  • 我认为你是对的。不过这很没有意义。它将“198”.Substring(2).PadLeft(2, '0') 转换为“08”。所以这是对三位数年份的保护?!
  • @McKay 将近三年后,我很难记住 什么 我在假设 - 但很可能,正如我所写的,我假设这行代码是不必要的“以防万一。”我没有解释它的意义,只是我认为它在做什么。
【解决方案2】:

这会将“98”打印到控制台。

class Program
{
    static void Main(string[] args)
    {
        Console.Write("1998".Substring(2).PadLeft(2, '0'));
        Console.Read();
    }
}

【讨论】:

    【解决方案3】:

    当然你可以运行它。您只是无法在您正在调试的应用程序中运行它。要找出它在做什么,而不仅仅是它看起来在做什么,请创建一个新的 Web 应用程序,放入一个 DropDownList,在其中放入一些静态年份,然后放入您提到的代码,看看它是什么做。那你就肯定知道了。

    【讨论】:

      【解决方案4】:

      一些愚蠢的东西。它获取所选项目的值并获取前两个字符之后的所有内容。如果只有一个字符,则在其开头添加一个“0”,如果是零个字符,则返回“00”。我之所以说这很愚蠢,是因为如果您需要将值设为两个字符长,为什么不在创建下拉列表时将其设置为开头?

      【讨论】:

        【解决方案5】:

        看起来它正在从第 3 个字符(如果基于 0)到末尾抓取子字符串,然后如果子字符串的长度小于 2,它会通过在左侧添加 0 来使长度等于 2。

        【讨论】:

          【解决方案6】:

          PadLeft 确保您从输入中接收到至少两个字符,用适当的字符填充输入(在左侧)。所以输入,在这种情况下,可能是 12。你得到“12”。或者输入可能是 9,在这种情况下,您会得到“09”。

          这是一个复杂链接的示例(请参阅"Is there any benefit in Chaining" 帖子)出错,并使代码显得过于复杂。

          【讨论】:

            【解决方案7】:

            子字符串返回跳过前两个字符的值,padleft 用前导零填充结果:

             string s = "2014";
                MessageBox.Show(s.Substring(2).PadLeft(2, 'x')); //14
                string s2 = "14";
                MessageBox.Show(s2.Substring(2).PadLeft(2, 'x')); //xx
            

            我的猜测是代码试图将年份转换为 2 位数值。

            【讨论】:

              【解决方案8】:

              仅当用户输入的年份为 2 位或 3 位数字时,PadLeft 才会执行某些操作。

              如果年份是 1 位数,则会出现异常(Subsring errs)。

              使用 2 位数年份(07、08 等),它将返回 00。我会说这是一个错误。

              对于作者可能认为是拼写错误的 3 位数年份 (207, 208),它将返回用零填充的最后一位数字 -- 207 -> 07; 208 -> 08.

              只要用户必须选择年份并且不允许输入年份,就不需要 PadLeft —— Substring(2) 完全符合 4 位数年份的要求。

              【讨论】:

                【解决方案9】:

                此代码似乎试图从四位数年份中获取 2 位数年份(提示为 ddlexpyear)

                它接受字符串并返回字符串,所以我将避开字符串分隔符:

                • 1998 -> 98
                • 2000 -> 00
                • 2001 -> 01
                • 2012 -> 12

                问题是它做得不好。在这些情况下,填充实际上并没有帮助。删除pad代码不影响正确的情况。

                所以代码可以工作 4 位数年(有或没有填充),它对其他长度的字符串有什么作用?

                • null:异常
                • 0:异常
                • 1:异常
                • 2:总是返回“00”。例如49 年(犹太人被驱逐出罗马时)变为“00”。这很糟糕。
                • 3:保存最后一位,并在其前面加上“0”。在 10% 的情况下正确(当第二个数字实际上是零时,例如 304 或 908),但在其余情况下则完全错误(例如 915、423 和 110)
                • 5:只保存第 3 位和第 4 位,这也是错误的,“10549”应该是“49”,而是“54”。
                • 正如您所料,问题在更高的数字上仍然存在。

                【讨论】:

                  【解决方案10】:

                  好的,所以它从下拉列表中获取值,ABCD

                  然后它从位置 2 获取子字符串,CD

                  然后它会出错,如果它也需要,用 2 个零填充它,CD

                  或者,如果你刚刚结束了 X,那么它将成为 X 的子字符串并填充到 OX

                  【讨论】:

                    【解决方案11】:

                    它取年份的最后两位数字,然后用“0”向左填充。

                    所以 2010 年是 10 日,2009 年是 09 日。

                    不知道为什么开发人员不只是将下拉列表中的值设置为最后两位数,或者为什么您需要保留它(除非您处理的是公元 0-9 年)。

                    【讨论】:

                    • 0-9 年的广告会抛出异常。
                    • @McKay,只是为了澄清一下,这篇文章是在询问代码在做什么以及它返回什么。我们回答这个问题的人既没有写代码也没有认可它。
                    • 您最后的评论“除非您处理的是公元 0-9 年”,这表明您对正在发生的事情存在误解。代码中的左填充对 0-9 年没有影响。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-08-26
                    • 2014-05-15
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多