読者です 読者をやめる 読者になる 読者になる

プログラマーな日々

プログラマー兼SEです。好きな習慣:TDD、好きなツール:WorkFlowy、好きな言語:C#、好きなAWSのサービス:Data Pipeline。趣味は開発環境を改善することです。

【.NET】指定した文字で桁埋めできる値を表すFormattableValueクラスを書いてみた

.NET C#

概要

指定した文字で桁埋めできる値を表すFormattableValueクラスを書いてみました。

検証環境

Visual Studio Community 2015 Update3

ソースコード

FormattableValue.cs

using System;

namespace JHashimoto.Infrastructure.ValueTypes {
    /// <summary>
    /// 指定した文字で、桁埋めできる値を表します。
    /// </summary>
    /// <typeparam name="T">値の型。</typeparam>
    public class FormattableValue<T> where T : IFormattable {
        /// <summary>
        /// 桁埋めする値。
        /// </summary>
        public T Value { get; }

        /// <summary>
        /// 桁数。
        /// </summary>
        public int Length { get; }

        /// <summary>
        /// 桁埋めに使う文字。
        /// </summary>
        public char PaddingChar { get; }

        /// <summary>
        /// <see cref="FormattableValue"/>クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="value">桁埋めする値。</param>
        /// <param name="length">桁数。</param>
        /// <param name="paddingChar">桁埋めに使う文字。</param>
        public FormattableValue(T value, int length, char paddingChar) {
            this.Value = value;
            this.Length = length;
            this.PaddingChar = paddingChar;
        }

        /// <summary>
        /// 現在のオブジェクトを表す文字列を返します。
        /// </summary>
        /// <returns>現在のオブジェクトを説明する文字列。</returns>
        public override string ToString() {
            string s = this.Value == null ? string.Empty : this.Value.ToString();

            return s.PadLeft(this.Length, this.PaddingChar);
        }
    }
}

テストコード

[TestMethod]
public void ゼロ埋め() {
    FormattableValue<int> v = new FormattableValue<int>(1000, 8, '0');

    string expected = "00001000";
    string actual = v.ToString();

    Assert.AreEqual(expected, actual);
}

[TestMethod]
public void 半角スペース埋め() {
    FormattableValue<int> v = new FormattableValue<int>(1000, 8, ' ');

    string expected = "    1000";
    string actual = v.ToString();

    Assert.AreEqual(expected, actual);
}

[TestMethod]
public void Null() {
    FormattableValue<Formattable> v = new FormattableValue<Formattable>(null, 8, ' ');

    string expected = new string(' ', 8);

    string actual = v.ToString();

    Assert.AreEqual(expected, actual);
}

class Formattable : IFormattable {
    public string ToString(string format, IFormatProvider formatProvider) {
        return base.ToString();
    }
}

動作結果

f:id:JHashimoto:20160827133919p:plain