TDD实践:非负整数转整型数组方法(C#)

1、引言
这是我碰到一道面试题,当时时间紧我用的字符串分隔实现的,其具体要求为:
将一非负整数转化为int[],如输入1234得到int[4]{ 1, 2, 3, 4 }。
今晚有兴致运用TDD方法做了个不转字符串的版本,主是依靠浮点数转为整数时丢失小数位值这一特性实现的。
*注:代码编写过程中单元测试与实现代码是相互交替的,并不像下面看到的分隔得那么明显。

2、单元测试:
    [TestFixture]
    
public class IntToArrayHelperTests : IntToArrayHelper
    {
        [Test]
        
public void TestGetNumberAt()
        {
            Assert.AreEqual(
0, GetNumberAt(01));
            Assert.AreEqual(
1, GetNumberAt(11));
            Assert.AreEqual(
1, GetNumberAt(211));
            Assert.AreEqual(
1, GetNumberAt(100011));

            Assert.AreEqual(
2, GetNumberAt(212));
            Assert.AreEqual(
1, GetNumberAt(876543211));
            Assert.AreEqual(
2, GetNumberAt(876543212));
            Assert.AreEqual(
7, GetNumberAt(876543217));
            Assert.AreEqual(
8, GetNumberAt(876543218));
        }

        [Test]
        
public void TestGetDigitCount()
        {
            Assert.AreEqual(
1, GetDigitCount(0));
            Assert.AreEqual(1, GetDigitCount(1));
            Assert.AreEqual(1, GetDigitCount(9));
            Assert.AreEqual(2, GetDigitCount(10));
            Assert.AreEqual(10, GetDigitCount(Int32.MaxValue));
        }

        [Test]
        
public void TestConvert()
        {
            
int[] a = new int[1] { 0 };
            Assert.AreEqual(a, Convert(
0));

            
int[] b = new int[1] { 1 };
            Assert.AreEqual(b, Convert(
1));

            
int[] c = new int[10] { 1234567890 };
            Assert.AreEqual(c, Convert(
1234567890));

            
int[] d = new int[9] { 987654321 };
            Assert.AreEqual(d, Convert(
987654321));

            
int[] max = new int[10] { 2147483647 };
            Assert.AreEqual(max, Convert(Int32.MaxValue));
        }

        [Test]       
        [ExpectedException(typeof(ArgumentOutOfRangeException))]
        
public void TestConvertWithNegative()
        {
            Convert(
-1);
        }
    }

3、实现代码:
    public class IntToArrayHelper
    {
        
protected int GetNumberAt(int value, int digit)
        {
            
int contrastNumber = (int)Math.Pow(10, digit);
            
int digitCutter = (int)Math.Pow(10, digit - 1);
            
return (value - value / contrastNumber * contrastNumber) / digitCutter;
        }

        
protected int GetDigitCount(int value)
        {            
            
if (value == 0)
                
return 1;

            
return (int)Math.Log10(value) + 1;
        }

        
public int[] Convert(int value)
        {
            
if (value < 0)
                
throw new ArgumentOutOfRangeException("value""Not less than zero.");            

            
int digitCount = GetDigitCount(value);
            
int[] result = new int[digitCount];

            
for (int i = 0; i < digitCount; ++i)
            {
                
int index = digitCount - i - 1;
                result[index] 
= GetNumberAt(value, i + 1);
            }

            
return result;
        }
    }


原文地址:https://www.cnblogs.com/SamZhang/p/836974.html