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

5

完全な説明:

{0:C}文字列のようなアイテムがある場合、そのC部分はフォーマット文字列です。ドキュメントを引用するには:

が存在する場合formatString、フォーマット項目によって参照される引数 はインターフェースを実装する必要があります(私の強調)IFormattable

IFormattableようなオブジェクトdoubleまたはオーバーロードdecimal持っているオブジェクトは、文字列を取り込みます。これはあなたの場合です。したがって、次のように変換されます。ToString"C"yourFormattableThing.ToString("C", null)

ただし、のドキュメントをstring見ると、string(あなたの のようなcosts[i]) は ではなくIFormattable、はフォーマット文字列をstring受け取る を持っていないことがわかります。ToStringしたがって、上記の私の引用の「実装する必要がある」に違反しています。

例外を発生させる代わりに、String.Format自分の部分を無視することを選択しますC

それで、何がうまくいかないかについてのあなたの説明があります。

さて、物事を機能させるには、文字列が実際に数値である場合は、それをorのIFormattableようなオブジェクトに変換/解析してから、数値型で書式文字列を使用します。decimaldouble"C"

于 2012-11-02T09:20:44.873 に答える
-1

以前の回答に基づいて、これはlinqを紹介するのに最適な場所のようです:

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

したがって、この場合でもまったく同じ方法で配列に対して機能しますが、リスト/キューなどからロジックにアクセスできるようにします...熱心に実行したい場合はToArray()、select の後に a を追加します。

于 2012-11-02T08:43:30.043 に答える