Another .NET Developers Blog


Rounding numbers to the nearest x.
March 26, 2008, 7:03 pm
Filed under: .net, programming | Tags: ,

Today we came across a very simple rounding problem: round a number up to the nearest 0.05.

A quick search came up with quite a few hints, but no concrete answer. So we rolled our own. Here’s the code.

using System;

namespace Util
{
    public class MathHelper
    {
        public static double RoundNumberUp(double number, double roundingFactor)
        {
            double rounded = RoundNumber(number, roundingFactor);
            if ((number - rounded) > 0)
            {
                rounded = rounded + roundingFactor;
            }

            return rounded;
        }

        public static double RoundNumber(double number, double roundingFactor)
        {
            double rounded = Math.Round(number * (1 / roundingFactor)) / (1 / roundingFactor);

            return rounded;
        }
    }
}

And here are the tests, which show how to use the class.

using NUnit.Framework;
using Util;

namespace Util.Tests
{
    [TestFixture]
    public class MathHelperTests
    {
        [Test]
        public void Should_round_a_number_up_to_the_nearest_0_05()
        {
            double result = MathHelper.RoundNumberUp(6.66, 0.05);
            Assert.AreEqual(6.7, result, 0.001);

            result = MathHelper.RoundNumberUp(6.7, 0.05);
            Assert.AreEqual(6.7, result, 0.001);

            result = MathHelper.RoundNumberUp(6, 0.05);
            Assert.AreEqual(6, result, 0.001);

            result = MathHelper.RoundNumberUp(6.13, 0.05);
            Assert.AreEqual(6.15, result, 0.001);

            result = MathHelper.RoundNumberUp(6.18, 0.05);
            Assert.AreEqual(6.2, result, 0.001);
        }
    }
}

Hope this comes in handy! Bye for now.



Compress and decompress strings in .NET
March 14, 2008, 1:20 pm
Filed under: .net, programming | Tags:

I recently had the need to store strings in a database in a compressed format. I wanted to store some potentially long strings in a SQL server image type column. After some time searching the internet for solutions I came across a neat .NET namespace called System.IO.Compression which looked like it could be the answer to my problem…

Here is the helper class I wrote to perform compression and decompression:

using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Text;

namespace Utility
{
    public static class CompressionHelper
    {
        public static byte[] CompressText(string text)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(text);
            MemoryStream compressedStream = new MemoryStream();
            DeflateStream compressedZipStream = new DeflateStream(compressedStream, CompressionMode.Compress, true);
            compressedZipStream.Write(buffer, 0, buffer.Length);
            compressedZipStream.Close();
            compressedStream.Position = 0;
            byte[] compressed = new byte[compressedStream.Length];
            compressedStream.Read(compressed, 0, (int)compressedStream.Length);
            return compressed;
        }

        public static string DecompressText(byte[] compressed)
        {
            MemoryStream compressedStream = new MemoryStream(compressed);
            DeflateStream zipStream = new DeflateStream(compressedStream, CompressionMode.Decompress);
            List<byte> bytes = new List<byte>();
            int offset = 0;
            while (true)
            {
                byte[] temp = new byte[offset + 100];
                int bytesRead = zipStream.Read(temp, offset, 100);
                if (bytesRead == 0)
                {
                    break;
                }
                for (int i = offset; i < offset + bytesRead; i++)
                {
                    bytes.Add(temp[i]);
                }
                offset += bytesRead;
            }
            return Encoding.UTF8.GetString(bytes.ToArray());
        }
    }
}

Of course you could argue that this class is too specialised right now. It served my purpose well, but you could take and return byte arrays or streams as parameters to make it more general and re-use friendly.

Please let me know if you find any bugs…

Enjoy!