字符串到十进制转换:点分隔而不是逗号

时间:2013-11-10 18:30:06

标签: c# decimal

我从文本框中读取了一个字符串。它包含一个用于小数分隔的逗号。

我将NumberFormatInfo.CurrencyDecimalSeparator设置为,(逗号),但是当我将字符串转换为十进制Convert.ToDecimal(mystring);时,我获得了十进制的点单独值。

示例:

decimal a=Convert.ToDecimal("1,2345"); ----> decimal is 1.2345

我也试过了:

double a=Convert.ToDouble("1,2345"); 

但是再次点到十进制

7 个答案:

答案 0 :(得分:32)

这一切都与文化有关。如果你有任何其他文化而不是“美国英语”(也是良好的发展方式),你应该使用这样的东西:

var d = Convert.ToDecimal("1.2345", new CultureInfo("en-US"));
// (or 1,2345 with your local culture, for instance)

(显然,您应该将“en-US”替换为您的号码文化local culture

以同样的方式,如果你想做ToString()

d.ToString(new CultureInfo("en-US"));

答案 1 :(得分:20)

而不是替换,我们可以强制像

这样的文化
var x = decimal.Parse("18,285", new NumberFormatInfo() { NumberDecimalSeparator = "," });

它将输出18.285

答案 2 :(得分:2)

感谢所有回复。

因为我必须在xml文件中写一个十进制数字,所以我发现了问题。在this讨论中,我了解到xml文件标准使用点作为十进制值,这与文化无关。 所以我的解决方案是在xml文件中写入点十进制数,并从同一个xml文件转换readed字符串mystring.Replace(".", ","); 感谢 Agat 建议在xml环境中研究问题和ΕГИІИО,因为我不知道visual studio不尊重我的文化设置我的代码。

答案 3 :(得分:0)

您正在Visual Studio中查看小数或双精度值。这不符合您对代码的文化设置。

如果要查看以逗号作为小数点分隔符的decimaldouble值,请更改“控制面板”上的“区域和语言”设置。

答案 4 :(得分:0)

我最终使用了这个解决方案。

decimal weeklyWage;
decimal.TryParse(items[2],NumberStyles.Any, new NumberFormatInfo() { NumberDecimalSeparator = "."}, out weeklyWage);

答案 5 :(得分:0)

我在使用Convert.ToSingle(my_value)时遇到了类似的问题 如果操作系统语言设置为英语2.5(示例)将被视为2.5 如果操作系统语言是德语,则2.5将被视为2.5,即25 我使用了提供的不变式IFormat,它可以工作。它总是对待'。'为“。”而不是“”,而与系统语言无关。

float var = Convert.ToSingle(my_value,System.Globalization.CultureInfo.InvariantCulture);

答案 6 :(得分:0)

    usCulture = new CultureInfo("vi-VN");
Thread.CurrentThread.CurrentCulture = usCulture;
Thread.CurrentThread.CurrentUICulture = usCulture;
usCulture = Thread.CurrentThread.CurrentCulture;
dbNumberFormat = usCulture.NumberFormat;
number = decimal.Parse("1.332,23", dbNumberFormat); //123.456.789,00

usCulture = new CultureInfo("en-GB");
Thread.CurrentThread.CurrentCulture = usCulture;
Thread.CurrentThread.CurrentUICulture = usCulture;
usCulture = Thread.CurrentThread.CurrentCulture;
dbNumberFormat = usCulture.NumberFormat;
number = decimal.Parse("1,332.23", dbNumberFormat); //123.456.789,00

/*Decision*/
var usCulture = Thread.CurrentThread.CurrentCulture;
var dbNumberFormat = usCulture.NumberFormat;
decimal number;
decimal.TryParse("1,332.23", dbNumberFormat, out number); //123.456.789,00