web-dev-qa-db-ja.com

小数の代わりにコンマを使用して数値を文字列としてフォーマットする

私は次の番号を持っています:4.3

ヨーロッパの友人の何人かのために、この番号を4,3として表示したいと思います。

私は次の行がトリックをするだろうという印象を受けました:

string ret = string.Format("{0:0,0}", 4.3); // returns "04", not "4,3"

間違った文字列を使用していますか?

13
DaveDev

おもう:

string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", 4.3); 

あなたがやりたいことをする必要があります。

31
JDunkerley
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
nfi.NumberGroupSeparator = ".";

double num = 4.3;
string ret = num.ToString(nfi);    // 4,3
31
LukeH

これはあなたが何をしたいかによります。アプリケーション全体を他の言語出力用に準備したい場合は、

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("de-DE");

混合言語アプリケーションが必要な場合(つまり、出力の一部が別の言語でフォーマットされている場合)、次のような特定の文字列関数のオーバーロードを使用する必要があります。

var culture =  System.Globalization.CultureInfo.GetCultureInfo("de-DE");   
String.Format (culture, "{0:0.0}", 4.3);

アプリケーションに必要なのは1行だけで、すべてが期待どおりになるため、可能であれば最初の方法をお勧めします。 2番目に、アプリケーション全体のすべてのStringouputメソッドにカルチャパラメーターを追加する必要があります。

11
Foxfire

より一般的な解決策として、 スレッドのUIカルチャを設定 ヨーロッパの友達が使用するカルチャに設定できます。これは、数字、通貨、日付などの表示に影響します。

3
bzlm

数値の書式設定では、デフォルトで現在の CultureInfoNumberFormatInfo が使用されるため、コンピューターの地域設定を使用して表示されます。

したがって、正しいCultureInfoが使用されていることを確認する以外は、特別なことをする必要はありません。

質問に関しては、はい、文字列は無効です。 「、」は、小数点記号ではなく、千単位の区切り文字を示します。 NumberFormatInfoと カスタム番号フォーマット を見てください。

2
Lucero

小数点の代わりにコンマを含むCultureInfoを使用します(たとえばフランス語):

string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3);
1
Thomas Levesque

はい、間違った文字列を使用しています。また、フォーマット文字列を指定するだけでは問題を解決できません。

書式設定文字列は、パターン"0"を使用して数値を書式設定し、長さ0に揃えます。

書式設定文字列で小数点を指定すると、現在のカルチャに関係なく、常にピリオドになります。一方、フォーマット結果の小数点記号は、常に現在のカルチャで使用されているものです。したがって、結果でコンマを小数点記号として取得するには、フォーマットに使用されるカルチャが、コンマを小数点記号として使用するカルチャであることを確認する必要があります。

スレッドの現在のカルチャを設定して、フォーマットによってデフォルトで使用されるようにするか、呼び出しでカルチャを指定することができます。

string ret = String.Format(CultureInfo.GetCultureInfo(1053), "{0:0.0}", 4.3);
1
Guffa

数値を操作するときに正しい culture を使用すれば、フレームワークによって数値のフォーマットを処理できます。

Console.WriteLine(4.3);

Console.WriteLine(4.3.ToString(CultureInfo.GetCultureInfo("fr-fr")));

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr");
Console.WriteLine(4.3);

「1回限りの」表示を行う場合は、2番目のアプローチが機能します。すべての数値を正しく表示したい場合は、実際には 現在のスレッドのカルチャ を設定する必要があります。このように、数値操作は、小数点、グループ化文字、およびその他のカルチャ固有のものを正しく処理します。

数値の解析についても同じことが言えます。ユーザーが1,234を入力した場合、1.234(コンマは小数点記号)または1234(コンマはグループ区切り文字)のどちらを入力したかをどのようにして知ることができますか?これは、文化が数字の表示方法を知っており、それらを正しく解析するためにも使用できるため、役立つ場所です。

Console.WriteLine(double.Parse("1,234"));

Console.WriteLine(double.Parse("1,234", CultureInfo.GetCultureInfo("fr-fr")));

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr");
Console.WriteLine(double.Parse("1,234"));

上記は、1234(コンマは私のen-usのデフォルトカルチャでは小数点です)、1.234(コンマはフランス語の小数点)、および1,234(ここでも、コンマはフランス語の小数点であり、スレッドのカルチャはフランス語に設定されているため、このカルチャを使用して表示されます。したがって、出力ではコンマが小数点として表示されます。

0
adrianbanks

スレッドカルチャを設定すると、この変換が自動的に行われます。ただし、これをカスタム文字列でフォーマットする場合は、次のようにすることができます。

string ret = string.Format("{0:0.00}", 4.3);

または

string ret = (4.3f).ToString("0.00");

「。」現在のカルチャの小数点の形式指定子です。カスタム番号形式の詳細については、次を参照してください。 http://msdn.Microsoft.com/en-us/library/0c899ak8.aspx

小数点の文字はいつでも確認できます。

string decimalChar = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
0