无法弄清楚此SubString.PadLeft在做什么
在我正在调试的这段代码中,我有以下代码snipit:
ddlExpYear.SelectedItem.Value.Substring(2).PadLeft(2, '0');
这会返回什么?我真的不能做太多,因为它是实时信用卡应用程序的一部分。我们可以从名称中想象到DropDownList包含4位数字的年份。
更新:谢谢大家。我没有进行太多的.NET开发,因此设置快速测试对我而言并不那么快。
解决方案
看起来好像是在从第三个字符(如果基于0)到末尾抓取子字符串,然后,如果子字符串的长度小于2,则通过在左侧添加0来使长度等于2.
它使用年份的最后两位数字,并在左侧用零填充,最多为2个字符。对于以08、07等结尾的到期年份,看起来像是"以防万一",请确保存在前导零。
好的,所以它从下拉列表中取值,ABCD
然后从位置2 CD获得子字符串
然后它会出错,如果需要的话,请向左填充2个零,CD
或者,如果我们刚结束X,则它将子串到X并填充到OX
它使用了一年的最后两位数字,然后在左边用" 0"填充。
因此,2010年将为10,2009年将为09.
不知道为什么开发人员不只是将下拉列表中的值设置为最后两位数字,还是不确定为什么我们需要将其保留下来(除非我们要处理的是公元0-9年)。
这会将" 98"打印到控制台。
class Program { static void Main(string[] args) { Console.Write("1998".Substring(2).PadLeft(2, '0')); Console.Read(); } }
PadLeft确保我们从输入中接收至少两个字符,并在输入(左侧)上填充适当的字符。因此,在这种情况下,输入可能是12. 我们将得到" 12"。或者输入可能为9,在这种情况下,我们将获得" 09"。
这是一个复杂的链接示例(请参阅"链接中是否有任何好处"一文)出了问题,并使代码显得过于复杂。
当然,我们可以运行此程序。我们只是无法在要调试的应用程序中运行它。要弄清它在做什么,而不仅仅是看它在做什么,请制作一个新的Web应用程序,放入一个DropDownList,放入其中一些静态年份,然后放入我们提到的代码并查看其内容做。然后我们将确定。
子字符串返回跳过前两个字符的值,左上角的结果用前导零填充:
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位数的值。
有点愚蠢。它获取所选项目的值,并获取前两个字符之后的所有内容。如果那只是一个字符,则在其开头添加一个" 0",如果它是零个字符,则返回" 00"。我之所以说这很愚蠢,是因为如果我们需要将值设为两个字符长,那么为什么在创建下拉列表时不只是像这样设置呢?
仅当用户输入2位数或者3位数长的年份时,PadLeft才会执行某些操作。
年份为1位数字时,我们会遇到一个例外(排除错误)。
如果是两位数的年份(07、08等),它将返回00。我会说这是一个错误。
对于作者可能假定为错别字的3位数字年份(207,208),它将返回最后一位数字填充为零-207-> 07; 208-> 08.
只要用户必须选择年份并且不允许输入年份,PadLeft就没有必要-Substring(2)完全可以满足我们指定的4位数字年份的需要。