ノルウェーの文化では、データベースの文字列列に10進値( "133,3")が格納されています。
その後、ユーザーは地域の設定を英語-米国に変更しました。 CultureInfo.InvariantCultureを使用して「133,3」を10進数に変換すると、無効な値またはエラーが発生します。
C#アプリケーションでこのシナリオを処理するための最良の方法はありますか?
よろしく、アナンド
システムカルチャに関係なく、CultureInfo.InvariantCulture
を指定すると、は「133,3」を小数として133.3に解析できなくなります 。同じことがアメリカ英語にも当てはまります。
あなたcouldは、値を解析するときにノルウェーの文化を指定するだけです(IFormatProvider
を取る decimal.TryParse
のオーバーロードを使用します)、または(できれば)データベースのフィールドを変更して、代わりに実際のデータ型(10進数)を反映します。
Convert.ToDecimal() を参照しましたか?
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string[] values = { "123456789", "12345.6789", "12 345,6789",
"123,456.789", "123 456,789", "123,456,789.0123",
"123 456 789,0123" };
CultureInfo[] cultures = { new CultureInfo("en-US"),
new CultureInfo("fr-FR") };
foreach (CultureInfo culture in cultures)
{
Console.WriteLine("String -> Decimal Conversion Using the {0} Culture",
culture.Name);
foreach (string value in values)
{
Console.Write("{0,20} -> ", value);
try {
Console.WriteLine(Convert.ToDecimal(value, culture));
}
catch (FormatException) {
Console.WriteLine("FormatException");
}
}
Console.WriteLine();
}
}
}
値を永続化するときに使用されていたカルチャがわかっている場合は、それを解析するときに使用できます。
Convert.ToDecimal("133,3", System.Globalization.CultureInfo.GetCultureInfo("no"));
もちろん、何らかの形式の浮動小数点数を使用するには、データベースへのデータの格納方法を変更したほうがよいでしょう。
Convert.ToDouble(textBox2.Text, new CultureInfo("uk-UA")).ToString(new CultureInfo("en-US"));
これで問題が解決します:.ToString(New CultureInfo( "en-US"))
私の問題を修正するために以下のコードを使用しました。前の通貨の小数部分をハードコーディングしました。ジェネリックではないかもしれません。しかし、私の問題は解決しました。
public static decimal? ToDecimal1(this string source)
{
CultureInfo usCulture = new CultureInfo("en-US");
if (string.IsNullOrEmpty(source.Trim1()))
return null;
else
return Convert.ToDecimal(source.Replace(",", ".").Trim(), usCulture);
}