使用多种格式从数值创建逗号分隔的字符串

时间:2014-09-04 07:21:14

标签: c# .net string string-formatting stringbuilder

我正在创建一个包含逗号分隔值列表的字符串,但这些数值具有不同的格式。目前我正在使用这样的东西:

var values = new StringBuilder();
// These are all of type double
values.AppendFormat("{0:F1},", aLength);
values.AppendFormat("{0:F4},", anAngle);
values.AppendFormat("{0:F1},", aHeight);
values.AppendFormat("{0:F2},{1:F2},", a2DPoint.X, a2DPoint.Y);
// while these are all of type int
values.Append(anID).Append(",");
values.Append(anInt).Append(",");
values.Append(anotherInt);
if (aListOfInt.Count > 0)
{
    values.Append(",");
    values.Append(String.Join(",", aListOfInt));
}

var resultString = values.ToString();

这是正确的方法吗?我也可以使用String.Join执行此操作,事先创建与List<string>类似的StringBuilder values,但会更好吗? 有更优雅的方式吗?

注意:我是C#

的新手

3 个答案:

答案 0 :(得分:0)

试试这个:

var objList = new List<object>();
objList.Add(1);
objList.Add(2.0);
...
var resultString = string.Join(",", objList.Cast<string>());

将您的值放在对象列表中,将值转换为字符串,然后加入值。

但是如上所述,您将失去格式。 我有另一个解决方案。我认为这是一个简短的语法而不会丢失每个值的格式:

var stringList = new List<string>{
    aLength.ToString("F1"),
    anAngle.ToString("F4"),
    ...
};
var resultString = string.Join(",", stringList);

答案 1 :(得分:0)

如果您正在寻找的内容更优雅(而不是最佳),您可以尝试以下内容:

//Note the commas in the formats,and that formats and data have the same size.
List<string> formats = new List<string>(new string[] {"{0:F1},", "{0:F4},", "{0:F2},",{0}});
List<object> data=new List<object>(new object[]{4,2,0.12,new object()});
StringBuilder resultBuilder=new StringBuilder();
for (int i = 0; i < 4; i++) {
       resultBuilder.AppendFormat(formats[i], data[i]);
 }
string result = resultBuilder.ToString();

只要您注意如何设置格式和数据,就不应该进行除for循环以外的任何其他处理。&#34; zip&#34;他们在一起。我建议在任何类a2DPoint上覆盖ToString(),这样你就可以把它推到单个格式块而不是特殊处理,或者将a2DPoint.X和a2DPoint.Y分成单独的数据/格式块。但是,这不是最有效的方法。列表占用了空间和时间;如果你提前知道你有多少条目,那么数组可能会更好。

编辑:评论中的方法示例 编辑:添加注释中引用的方法示例:

public class FormatZipper {
    //This could be two lists, but it's probably more space/time efficent to use a single list. 
    List<Tuple<string,object>> _entries;
    StringBuilder _builder;
    public FormatZipper() {
        _builder = new StringBuilder();
        _entries = new List<Tuple<string, object>>();
    }
    public void AddEntry(string fmt, object data) {
        _entries.Add(Tuple.Create(fmt, data));
    }

    public string CurrentString {
        get {
            _builder.Clear();
            foreach (var entry in _entries) {
                _builder.AppendFormat(entry.Item1, entry.Item2);
            }
            return _builder.ToString();
        }
    }
}
class Program {
    static void Main(string[] args) {
        FormatZipper zipper = new FormatZipper();
        zipper.AddEntry("{0:F1},", 1);
        Console.WriteLine(zipper.CurrentString);
        zipper.AddEntry("{0:F2,", 1);
        Console.WriteLine(zipper.CurrentString);


    }
}

答案 2 :(得分:0)

我认为这样做非常好:

var resultString = String.Join(",", new []
{
    aLength.ToString("F1"),
    anAngle.ToString("F4"),
    aHeight.ToString("F1"),
    a2DPoint.X.ToString("F2"),
    a2DPoint.Y.ToString("F2"),
    anID.ToString(),
    anInt.ToString(),
    anotherInt.ToString(),
}.Concat(aListOfInt.Select(x => x.ToString())));