3

这似乎是一个非常愚蠢的问题,但我还没有设法解决它。这是代码:

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;
}

我希望输出应该是我存储在我的字符串数组中的数字将被格式化为货币,但是当它们从另一端出来时它们完全没有变化。

我不知道为什么会这样,并且尝试了其他一些方法来格式化它,但没有。

4

5 回答 5

11

您应该这样做,{0:C}用于货币格式,它将适用于数值。

costs[i] = String.Format("{0:C}", Convert.ToDecimal(costs[i]));
于 2012-11-02T08:24:24.913 回答
5

完整解释:

当您{0:C}的字符串中有类似的项目时,该C部分是格式字符串。引用文档

如果formatString存在,则格式项引用的参数 必须实现IFormattable接口(我的重点)

一个IFormattabledoubledecimal一个重载的对象ToString接受一个字符串,这可能是"C"你的情况。所以它翻译成类似yourFormattableThing.ToString("C", null).

但是,当您查看的文档时string,您会发现 a string(如您的costs[i])不是IFormattable,并且 astring不具有ToString采用格式字符串的 a 。所以你违反了我上面引用的“必须实施”。

String.Format选择忽略您的C部分,而不是引发异常。

所以这是你对出了什么问题的解释。

现在,为了使事情正常进行,如果您的字符串确实是一个数字,请将其转换/解析为IFormattable类似decimalor的对象double,然后"C"在数字类型上使用格式字符串。

于 2012-11-02T09:20:44.873 回答
0

这是因为参数string[] costs类型是字符串,所以它不会像您期望的那样格式化数字。您必须将参数类型更改为数字(int、long、float、double 等),或者您必须在格式化之前将值转换为数字类型。

var val = Convert.ToInt32(costs[i]);
costs[i] = String.Format("Value is: {0:C}", val);
于 2012-11-02T08:28:27.030 回答
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}".Mend("0", "1", "2");

于 2017-09-12T19:52:32.037 回答
-1

基于先前的答案,这似乎是介绍 linq 的理想场所:

private IEnumerable<String> ConvertToCurrency(IEnumerable<String> costs)
{
 return costs.Select(c => String.Format("{0:C}", Convert.ToDecimal(c)));
}

所以在这种情况下,它仍然可以以完全相同的方式在数组上工作,但使逻辑可以访问列表/队列等......如果你想急切地ToArray()在选择后执行添加一个。

于 2012-11-02T08:43:30.043 回答