http://blogs.wankuma.com/rti/archive/2007/11/19/109158.aspx
お疲れ様でした
の続きです。
コードの処理としては、0~9の文字のみが格納された文字列で四則演算を行うというものです。
但し、計算できるのは自然数のみで、エラー時には常にゼロを返します。
四則演算は、筆算をシミュレートしています。
var v1 = "4567";
var v2 = "123";
string r1 = StringCalc.Add(v1, v2);
string r2 = StringCalc.Subtract(v1, v2);
string r3 = StringCalc.Multiplication(v1, v2);
string r4 = StringCalc.Division(v1, v2);
こんな感じの処理で、r1~4 には、それぞれ "4690", "4444", "561741", "37" が格納されれば良い訳です。
この処理は、次のように書くことができます。
実際に使用したサンプルコードは、オブジェクト指向プログラミングという前提もあったので、複数のクラスに分散して処理を書きました。
しかし、実際には静的なメソッドにする方がわかりやすそうなので、以後はそうした前提で行こうかと思います。
筆算をシミュレートするので、確実に使うであろう処理は、指定された桁の数値を取得するという処理です。
例えば、"4567" という文字列の 2 桁目は 6 という数値であることを容易に取得できると全体的に便利です。
そこで、C#3.0 の新機能である
拡張メソッド
を使って以下のようなコードを書きます。
static class Extensions {
public static decimal ToDecimal(this char c) {
var r = 0m;
if (decimal.TryParse(c.ToString(), out r)) return r;
throw new ArgumentException();
}
public static decimal GetOneDigit(this string value, int digitIndex) {
if (digitIndex < 0 || digitIndex > value.Length - 1) return 0m;
return value[value.Length - (digitIndex + 1)].ToDecimal();
}
}
これによって、同一の名前空間内に置いて、"4567".GetOneDegit(1) とすれば、 6 という数値が decimal 型で取得できるようになります。
(つづく)