コマンドラインをぶった切る(手抜き)

よいこはまねしません

private static bool TrySplit(string cl, out List ls)
{
	ls = new List();
	var rv = ls;
	var status = 0;
	var sb = new StringBuilder();
	var fa = new Action[] {
		c => {
			if (!char.IsWhiteSpace(c))
			{
				sb.Append(c);
				status = c.Equals('"') ? 2 : 1;
			}
		},
		c => {
			if (char.IsWhiteSpace(c))
			{
				rv.Add(sb.ToString());
				sb.Clear();
				status = 0;
			}
			else
			{
				if (c.Equals('"'))
				{
					rv.Add(sb.ToString());
					sb.Clear();
					status = 2;
				}
				sb.Append(c);
			}
		},
		c => {
			if (char.IsWhiteSpace(c))
			{
				rv.Add(sb.ToString());
				sb.Clear();
				status = 0;
			}
			else
			{
				sb.Append(c);
				if (c.Equals('"')) {
					rv.Add(sb.ToString());
					sb.Clear();
					status = 0;
				}
			}
		}
	};
	foreach (var c in cl)
		fa[status](c);
	if (status == 1)
	{
		rv.Add(sb.ToString());
		sb.Clear();
	}
	return status != 2;
}

■[C#]

ソース

using System;
class Test {
  static void Main() {
    var m0 = (1e16m + 9m) / ulong.MaxValue;
    var m1 = (1e16m + 10m) / ulong.MaxValue;
    Console.WriteLine("m0 = {0:e25}", m0);
    Console.WriteLine("m1 = {0:e25}", m1);
    Console.WriteLine("m1 > m0 = {0}", m1 > m0);
    var d0 = decimal.ToDouble(m0);
    var d1 = decimal.ToDouble(m1);
    Console.WriteLine("d0 = {0:e17}", d0);
    Console.WriteLine("d1 = {0:e17}", d1);
    Console.WriteLine("d1 >= d0 = {0}", d1 >= d0);
  }
}

実行♪

m0 = 5.4210108624275270492409140e-004
m1 = 5.4210108624275275913420000e-004
m1 > m0 = True
d0 = 5.42101086242752760e-004
d1 = 5.42101086242752650e-004
d1 >= d0 = False

…え˝