Copy string.Fromat
从.net Framework中copy出来的,修改了一下
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(Format(null, "ss{0}ww{0}ee{1}", "AAA", "BBB"));
}
private static void FormatError()
{
throw new FormatException("参数格式错误");
}
public static string Format(IFormatProvider provider, String format, params Object[] args)
{
if (format == null || args == null)
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
StringBuilder sb = new StringBuilder();
char[] chars = format.ToCharArray(0, format.Length);
int pos = 0;
int len = chars.Length;
char ch = '\x0';
ICustomFormatter cf = null;
if (provider != null)
{
cf = (ICustomFormatter)provider.GetFormat(typeof(ICustomFormatter));
}
while (true)
{
int p = pos;
int i = pos;
while (pos < len)
{
ch = chars[pos];
pos++;
if (ch == '}')
{
if (pos < len && chars[pos] == '}') // Treat as escape character for }}
pos++;
else
FormatError();
}
if (ch == '{')
{
if (pos < len && chars[pos] == '{') // Treat as escape character for {{
pos++;
else
{
pos--;
break;
}
}
chars[i++] = ch;
}
if (i > p) sb.Append(chars, p, i - p);
if (pos == len) break;
pos++;
if (pos == len || (ch = chars[pos]) < '0' || ch > '9') FormatError();
int index = 0;
do
{
index = index * 10 + ch - '0';
pos++;
if (pos == len) FormatError();
ch = chars[pos];
} while (ch >= '0' && ch <= '9' && index < 1000000);
if (index >= args.Length) throw new FormatException("索引(从零开始)必须大于或等于零,且小于参数列表的大小。");
while (pos < len && (ch = chars[pos]) == ' ') pos++;
bool leftJustify = false;
int width = 0;
if (ch == ',')
{
pos++;
while (pos < len && chars[pos] == ' ') pos++;
if (pos == len) FormatError();
ch = chars[pos];
if (ch == '-')
{
leftJustify = true;
pos++;
if (pos == len) FormatError();
ch = chars[pos];
}
if (ch < '0' || ch > '9') FormatError();
do
{
width = width * 10 + ch - '0';
pos++;
if (pos == len) FormatError();
ch = chars[pos];
} while (ch >= '0' && ch <= '9' && width < 1000000);
}
while (pos < len && (ch = chars[pos]) == ' ') pos++;
Object arg = args[index];
String fmt = null;
if (ch == ':')
{
pos++;
p = pos;
i = pos;
while (true)
{
if (pos == len) FormatError();
ch = chars[pos];
pos++;
if (ch == '{')
{
if (pos < len && chars[pos] == '{') // Treat as escape character for {{
pos++;
else
FormatError();
}
else if (ch == '}')
{
if (pos < len && chars[pos] == '}') // Treat as escape character for }}
pos++;
else
{
pos--;
break;
}
}
chars[i++] = ch;
}
if (i > p) fmt = new String(chars, p, i - p);
}
if (ch != '}') FormatError();
pos++;
String s = null;
if (cf != null)
{
s = cf.Format(fmt, arg, provider);
}
if (s == null)
{
if (arg is IFormattable)
{
s = ((IFormattable)arg).ToString(fmt, provider);
}
else if (arg != null)
{
s = arg.ToString();
}
}
if (s == null) s = String.Empty;
int pad = width - s.Length;
if (!leftJustify && pad > 0) sb.Append(' ', pad);
sb.Append(s);
if (leftJustify && pad > 0) sb.Append(' ', pad);
}
return sb.ToString();
}
}
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(Format(null, "ss{0}ww{0}ee{1}", "AAA", "BBB"));
}
private static void FormatError()
{
throw new FormatException("参数格式错误");
}
public static string Format(IFormatProvider provider, String format, params Object[] args)
{
if (format == null || args == null)
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
StringBuilder sb = new StringBuilder();
char[] chars = format.ToCharArray(0, format.Length);
int pos = 0;
int len = chars.Length;
char ch = '\x0';
ICustomFormatter cf = null;
if (provider != null)
{
cf = (ICustomFormatter)provider.GetFormat(typeof(ICustomFormatter));
}
while (true)
{
int p = pos;
int i = pos;
while (pos < len)
{
ch = chars[pos];
pos++;
if (ch == '}')
{
if (pos < len && chars[pos] == '}') // Treat as escape character for }}
pos++;
else
FormatError();
}
if (ch == '{')
{
if (pos < len && chars[pos] == '{') // Treat as escape character for {{
pos++;
else
{
pos--;
break;
}
}
chars[i++] = ch;
}
if (i > p) sb.Append(chars, p, i - p);
if (pos == len) break;
pos++;
if (pos == len || (ch = chars[pos]) < '0' || ch > '9') FormatError();
int index = 0;
do
{
index = index * 10 + ch - '0';
pos++;
if (pos == len) FormatError();
ch = chars[pos];
} while (ch >= '0' && ch <= '9' && index < 1000000);
if (index >= args.Length) throw new FormatException("索引(从零开始)必须大于或等于零,且小于参数列表的大小。");
while (pos < len && (ch = chars[pos]) == ' ') pos++;
bool leftJustify = false;
int width = 0;
if (ch == ',')
{
pos++;
while (pos < len && chars[pos] == ' ') pos++;
if (pos == len) FormatError();
ch = chars[pos];
if (ch == '-')
{
leftJustify = true;
pos++;
if (pos == len) FormatError();
ch = chars[pos];
}
if (ch < '0' || ch > '9') FormatError();
do
{
width = width * 10 + ch - '0';
pos++;
if (pos == len) FormatError();
ch = chars[pos];
} while (ch >= '0' && ch <= '9' && width < 1000000);
}
while (pos < len && (ch = chars[pos]) == ' ') pos++;
Object arg = args[index];
String fmt = null;
if (ch == ':')
{
pos++;
p = pos;
i = pos;
while (true)
{
if (pos == len) FormatError();
ch = chars[pos];
pos++;
if (ch == '{')
{
if (pos < len && chars[pos] == '{') // Treat as escape character for {{
pos++;
else
FormatError();
}
else if (ch == '}')
{
if (pos < len && chars[pos] == '}') // Treat as escape character for }}
pos++;
else
{
pos--;
break;
}
}
chars[i++] = ch;
}
if (i > p) fmt = new String(chars, p, i - p);
}
if (ch != '}') FormatError();
pos++;
String s = null;
if (cf != null)
{
s = cf.Format(fmt, arg, provider);
}
if (s == null)
{
if (arg is IFormattable)
{
s = ((IFormattable)arg).ToString(fmt, provider);
}
else if (arg != null)
{
s = arg.ToString();
}
}
if (s == null) s = String.Empty;
int pad = width - s.Length;
if (!leftJustify && pad > 0) sb.Append(' ', pad);
sb.Append(s);
if (leftJustify && pad > 0) sb.Append(' ', pad);
}
return sb.ToString();
}
}