这似乎是一个非常愚蠢的问题,但我还没有设法解决它。这是代码:
private string[] ConvertToCurrency(string[] costs)
{
int count = costs.Length;
for (int i = 0; i < count - 1; i++)
{
costs[i] = String.Format("{0:C}", costs[i]);
}
return costs;
}
我希望输出应该是我存储在我的字符串数组中的数字将被格式化为货币,但是当它们从另一端出来时它们完全没有变化。
我不知道为什么会发生这种情况,并尝试了其他方法来格式化它,但没有。
答案 0 :(得分:11)
您应该这样做,{0:C}
用于货币格式,它将应用于数值。
costs[i] = String.Format("{0:C}", Convert.ToDecimal(costs[i]));
答案 1 :(得分:5)
完整的解释:
如果字符串中有{0:C}
项,那么C
部分就是格式字符串。引用the documentation:
如果存在
formatString
,则格式项引用的参数 必须实施IFormattable
界面(我的重点)
IFormattable
或double
decimal
ToString
"C"
yourFormattableThing.ToString("C", null)
string
costs[i]
IFormattable
string
ToString
String.Format
C
IFormattable
你的情况。因此它转换为decimal
。
但是,当您查看an overload时,您会发现double
(与您的"C"
一样)不是{{1}},而{{1}}则不是{{1}}拥有一个{{1}},它接受一个格式字符串。所以你违反了上面引用的“必须实施”。
{{1}}选择忽略您的{{1}}部分而不是引发例外。
所以你有什么问题的解释。
现在,为了使事情有效,如果您的字符串实际上是一个数字,请将其转换/解析为{{1}} {{1}}或{{1}}之类的{{1}}对象,然后使用{{1格式化数字类型的字符串。
答案 2 :(得分:0)
这是因为参数string[] costs
类型是字符串,因此它不会按预期格式化数字。您必须将参数类型更改为数字(int,long,float,double等),或者在格式化之前必须将值转换为数字类型。
var val = Convert.ToInt32(costs[i]);
costs[i] = String.Format("Value is: {0:C}", val);
答案 3 :(得分:0)
public static class StringExtensions
{
/// <summary>
/// Formats a string using the string.Format(string, params object[])
/// </summary>
/// <param name="helper">The string with the format.</param>
/// <param name="args">The value args.</param>
/// <returns>The formatted string with the args mended in.</returns>
public static string Mend(this string helper, params object[] args) => string.Format(helper, args);
}
//用法:“零:{0},一:{1},二:{2}”。修补(“0”,“1”,“2”);
答案 4 :(得分:-1)
基于之前的答案,这似乎是介绍linq的理想之地:
private IEnumerable<String> ConvertToCurrency(IEnumerable<String> costs)
{
return costs.Select(c => String.Format("{0:C}", Convert.ToDecimal(c)));
}
因此,在这种情况下,它仍将以完全相同的方式在数组上工作,但使Lists / Queue等可以访问逻辑...如果您想要执行,请在select之后添加ToArray()
。 / p>