2

このコード:Console.Out.WriteLine(string.Format(CultureInfo.GetCultureInfo("hu-HU"), "{0:C}", 1234.56M))次の出力が生成されます: 1 234,56 Ft、これは技術的には正しいですが、通貨を推測するにはどうすればよいでしょうか??

この動作は、表示カルチャを hu-HU から en-US に変更するだけで、現在のレートに応じて、値が 200 倍以上になることを意味します。500 USD の代わりに 500 HUF を請求する間違いはありません。明らか。

通貨を設定する唯一の「良い」方法は、目的のカルチャを複製して通貨記号を設定することです。

var format = NumberFormatInfo.GetInstance(CultureInfo.GetCultureInfo("en-US")).Clone() as NumberFormatInfo;
format.CurrencySymbol = "asd";
Console.Out.WriteLine(string.Format(format, "{0:C}", 1234.56M));

これは正しい生成asd1,234.56で機能しますが、非常に面倒です。

私の質問は次のとおりです。

  1. 私たちが何十年も生きてきたこのグローバルな世界で、国の通貨のデフォルト率はどのくらいですか?
  2. 金額と通貨は非常に結びついているのに、より関連性のある方法で指定する方法がないのはなぜですか?
  3. おまけ: 文化に sk-SK を使用すると、「既定の」通貨でユーロが得られます。フレームワーク 2.0 に変更するとSk、2005 年にスロバキア コルナが国の通貨だったので、(スロバキア コルナの場合) 取得する必要があります。(まあ、それは起こりません。しかし、2.0以降のシステムでは試していません。)

更新: 結論:

  1. 文化から通貨をデフォルトにすることは、一部の人にとってはすべて正常であり、他の人にとっては奇妙です(私を含む)
  2. 長さ、重さなどの種類がないので「金額」の種類はありませんが、限度額はどこですか?Virtlink はこのためのライブラリを作成しました: M42 Financial
4

5 に答える 5

4

私は考えを変えました。通貨が文化の一部であることは奇妙だというあなたの意見に同意します。

単位を値で指定することは、.NET および Java では一般的ではありません。通常、気温、距離、通貨を単位で指定することはありません。ほとんどの意図と目的で、単位は開発者によって想定されています。距離はメートル、温度は摂氏です。特定のカルチャに対して、.NET で指定された既定の距離単位または温度単位はありません。

一貫性を保つために、.NET Framework はカルチャに通貨情報を追加するべきではありません。ほとんどの人は複数の通貨を扱っており、複数の通貨を受け入れる国さえあります。特定の文化のすべての人が 1 つの通貨のみを使用するわけではありません。

.NET フレームワークにはSystem.Currencyクラスが含まれていますが、それは非表示 (内部) であり、Decimal.ToOACurrency()メソッドにのみ使用されます。それも本当に役に立ちません。Java にはCurrency2002 年からクラスが含まれていますが、2000 年に .NET Framework が作成され、多くの設計ミスが Java からコピーされたため、これはその 1 つかもしれません。ただし、JavaLocaleクラスに通貨情報が含まれている (または含まれている) かどうかについての情報は見つかりませんでした。

さて、単位が .NET で指定されることはなく、カルチャの既定の通貨が存在するべきではないという考えから続けて、通貨値の通貨単位をどこに置くべきでしたか? もちろん、彼らはCurrencyクラスを作成する必要がありました。

于 2013-03-04T14:32:25.183 に答える
2

これは、複数の通貨がアプリケーションに表示される可能性がある場合に使用することを意図していないと思います. お金を現地通貨で解釈する必要がある数値として扱う単純なアプリケーションがある場合に便利です。

それ以外の場合は、使用しないでください。

理にかなっているようなアプリケーションはあまりないと思います。

于 2013-03-04T14:37:35.850 に答える
0

.NET 通貨形式に通貨記号が含まれるのはなぜですか?

通貨形式だからです。

于 2013-03-04T15:53:42.863 に答える
0

デザイナーが何を考えていたのかはわかりませんが、彼らの決定は私にとって理にかなっています。質問に答えるには:

  1. 私たちとクライアントのほとんどは、私たちが住んでいる国に依存する単一の通貨を扱っています。そのカルチャのデフォルトの通貨をデフォルトにすることは理にかなっています。
  2. 通貨記号と数値形式は個別に設定されます。これは、通貨記号を変更するときにデフォルトの数値形式を維持したい場合が非常に多いためです。たとえば、私が (米国で) 英国ポンドで金額を印刷している場合、数値形式を変更したくありません。通貨記号のみです。両方を設定する必要がある場合は、新しい通貨記号だけでなく、使用している特定の数値形式も知っておく必要があります。また、それらを組み合わせた場合、(通貨以外の値の) 数値形式を変更するには、通貨記号も指定する必要があります。まったく別の 2 つの数値形式を使用していない限り、これはおかしなことです。
  3. その特定の問題については答えがありません。

つまり、2 つの個別の設定を使用すると、柔軟性が向上し、作業がシンプルになります。物事を組み合わせると、物事を個別に変更するのにより多くの作業が必要になります。

于 2013-03-04T14:32:13.293 に答える
-4

.NET はわかりませんが、フォーマッタでフォーマット文字列の「M」を省略できますか?

だからこれ:これ1234.56の代わりに1234.56M

于 2013-03-04T14:24:20.677 に答える