45

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

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

例子:

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

我也试过:

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

但又是小数点

4

7 回答 7

53

这一切都与文化有关。如果您有“美国英语”以外的其他文化(以及良好的发展方式),您应该使用以下内容:

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

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

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

d.ToString(new CultureInfo("en-US"));
于 2013-11-10T18:46:32.053 回答
36

我们可以强制文化而不是替换

var x = decimal.Parse("18,285", new NumberFormatInfo() { NumberDecimalSeparator = "," });

它将给出输出 18.285

于 2013-12-30T06:10:21.987 回答
8

谢谢大家的回复。

因为我必须在 xml 文件中写一个十进制数,所以我找到了问题所在。在这个讨论中,我了解到 xml 文件标准使用点表示十进制值,这与文化无关。所以我的解决方案是在 xml 文件中写入点十进制数并从同一个 xml 文件转换读取的字符串mystring.Replace(".", ","); 感谢Agat建议在 xml 上下文和Ε Г И І И О中研究问题,因为我不知道 Visual Studio 没有'不尊重我在代码中的文化设置。

于 2013-11-11T20:47:01.990 回答
3

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

decimal weeklyWage;
decimal.TryParse(items[2],NumberStyles.Any, new NumberFormatInfo() { NumberDecimalSeparator = "."}, out weeklyWage);
于 2016-12-30T08:51:15.217 回答
2

您正在 Visual Studio 中查看十进制或双精度值。这不尊重您对代码的文化设置。

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

于 2013-11-10T18:51:31.150 回答
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);

于 2019-03-13T11:53:49.527 回答
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
于 2020-05-26T10:56:42.940 回答