我有一个十进制值(“133,3”)存储在挪威文化数据库的字符串列中。
之后,用户将区域设置更改为english-Us。当我使用CultureInfo.InvariantCulture将“133,3”转换为十进制时,获取无效值或错误。
在 C#应用程序中有没有最好的方法来处理这种情况?
的问候, 阿南德
答案 0 :(得分:17)
无论系统文化如何,如果您指定CultureInfo.InvariantCulture
,将无法<133>将“133,3”解析为133.3。美国英语也是如此。
你可以在解析值时指定一个挪威文化(使用decimal.TryParse
的重载,它需要IFormatProvider
),或者(最好)更改字段中的字段数据库反映实际数据类型(十进制数)。
答案 1 :(得分:9)
你是否提到了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();
}
}
}
答案 2 :(得分:5)
如果你知道在保存值时使用的文化,你可以在解析它时使用它,即:
Convert.ToDecimal("133,3", System.Globalization.CultureInfo.GetCultureInfo("no"));
当然,您可能最好更改数据在数据库中的存储方式,以使用某种形式的浮点数。
答案 3 :(得分:5)
Convert.ToDouble(textBox2.Text, new CultureInfo("uk-UA")).ToString(new CultureInfo("en-US"));
答案 4 :(得分:2)
这解决了您的问题:.ToString(New CultureInfo(“en-US”))
答案 5 :(得分:0)
使用下面的代码来解决我的问题。我只是硬编码了以前的货币小数部分。可能不是通用的。但解决了我的问题。
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);
}
答案 6 :(得分:0)
希望有帮助
double _number = 12536,8;
CultureInfo usCulture = new CultureInfo("en-US");
return _number.ToString("N", us);