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

Lov*_*ife 33 c# decimal

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

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

例:

decimal a=Convert.ToDecimal("1,2345"); ----> decimal is 1.2345
Run Code Online (Sandbox Code Playgroud)

我也试过了:

double a=Convert.ToDouble("1,2345"); 
Run Code Online (Sandbox Code Playgroud)

但是再次点到十进制

Aga*_*gat 35

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

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

(显然,你应该用你当地文化的文化取代"en-US" )

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

d.ToString(new CultureInfo("en-US"));
Run Code Online (Sandbox Code Playgroud)

  • 如果您进行大量解析,请考虑使用 `CultureInfo.GetCultureInfo("en-US")` 而不是 `new CultureInfo("en-US")`。这是因为前者一遍又一遍地返回相同的缓存实例,而后者显然每次都必须创建一个新对象(垃圾收集器很快就会再次删除该对象)。然而,两者并不完全等同。文化对象的 `UseUserOverride` 属性。因此,请考虑如果用户更改了操作系统中“en-US”的设置,您希望发生什么情况。 (2认同)

小智 25

而不是取代我们可以强迫文化

var x = decimal.Parse("18,285", new NumberFormatInfo() { NumberDecimalSeparator = "," });
Run Code Online (Sandbox Code Playgroud)

它将输出18.285

  • 如果当前的文化像德国一样,那是行不通的。它将保留逗号作为小数点分隔符 (2认同)
  • 这应该是正确答案。无需看文化,只需指定小数点分隔符 (2认同)

Lov*_*ife 7

谢谢大家的回复。

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