You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将数值数组格式化为指定格式的字符串?

问题描述

想要利用String.Format的public static string Format (string format, params object?[] args);重载,实现类似Python中str.format(*args)的效果——将数组中的元素按指定格式分别占位输出。

但调用以下代码时触发错误:

var a = String.Format("{0} {1:0.00000000e+000} {2:0.00000000e+000}", new Double[] {1,2,3} );

错误提示:

Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

若改为调用var a = String.Format("{0}", new Double[] {1,2,3} );,虽无错误,但返回结果为"System.Double[]",并非期望的"1 2.00000000e+000 3.00000000e+000"(类似Python代码a="{0:d} {1:1.8e} {2:1.8e}".format(*[1,2,3])的输出)。

此外,认为String.Concat((new Double[] { 1,2,3 }).Select(k => string.Format("{0}", k)))并非最优方案,不想浪费String.Format(String, params object[])重载的设计意义。

解决方法

核心原因

C#中直接将double[]数组传给params object?[] args时,数组会被当作单个object参数传入,而非像Python的*那样自动拆分为多个独立参数。这会导致格式字符串中的占位符无法匹配足够的参数,或直接输出数组类型名。

正确实现方式

方式1:显式转换为object[](兼容所有支持params的C#版本)

double[] values = { 1, 2, 3 };
var result = string.Format("{0} {1:0.00000000e+000} {2:0.00000000e+000}", (object[])values);

通过将double[]显式转换为object[],数组中的每个元素会被当作独立参数传递给String.Format的params重载,从而正确匹配格式字符串中的{0}、{1}、{2}占位符。

方式2:使用C# 11+列表展开运算符..(更简洁)

double[] values = { 1, 2, 3 };
var result = string.Format("{0} {1:0.00000000e+000} {2:0.00000000e+000}", ..values);

..运算符会直接将数组元素逐个展开为方法参数,效果和Python的*完全一致,代码更简洁直观。

效果验证

两种方式最终都会得到期望结果:

"1 2.00000000e+000 3.00000000e+000"

内容的提问来源于stack exchange,提问作者Girardi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:08:20