如何防止decimal.TryParse转换","到"。"?

时间:2015-05-07 08:12:55

标签: c# parsing

这是我的代码:

string myValue = "0,203";

decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal;

...

myValueAsDecimal is 0.203 now

myValueAsDecimal之后TryParse是否有0,203或decimal的内部表示总是0.203,如果我需要0,203,我需要格式化GUI输出吗?

4 个答案:

答案 0 :(得分:6)

  

在TryParse

之后,myValueAsDecimal是否有0,203

没有。它只是一个数字 - 它没有文本格式的概念。要用更简单的类型来考虑另一种方法,请考虑以下两行代码:

int x = 0x100;
int y = 256;

这两个值是否相同?是的,它们代表相同的数字。如果将xy的值转换为字符串,默认情况下它们最终都会变为“256” - 但如果您请求十六进制表示,它们最终都可以为“100”。< / p>

区分变量的真实值和文本表示很重要。很少有类型(我无法立即考虑)携带有关文本表示的信息 - 例如,DateTime可以从各种格式解析,但没有原始的“记忆”文字格式。这只是一个日期和时间,然后可以根据任何格式进行格式化。

如果您需要来维护“十进制数字及其最初表示的文化”的概念,那么您应该为该配对创建自己的类或结构。 decimal本身并不存在。

答案 1 :(得分:2)

decimal d = 0.203m;

Console.WriteLine(d.ToString(CultureInfo.InstalledUICulture));
Console.WriteLine(d.ToString(CultureInfo.InvariantCulture));        // decimal point: dot
Console.WriteLine(d.ToString(CultureInfo.GetCultureInfo("en-US"))); // default decimal point: dot
Console.WriteLine(d.ToString(CultureInfo.GetCultureInfo("ru-RU"))); // default decimal point: comma

结果:

0,203
0.203
0.203
0,203

答案 2 :(得分:1)

您的CurrentCulture看起来像NumberDecimalSeparator https://templth.wordpress.com/2015/02/23/optimizing-restlet-server-applications/,这就是解析成功的原因。

实际上,0.203与值相同。打印时,唯一的问题是它们的文本表示。

如果您希望将自己的价值作为0,203表示,则可以使用0,203作为,的文化。

例如,我的文化(NumberDecimalSeparator)有一个tr-TR。当您使用它表示小数时,您将获得,

0,203

答案 3 :(得分:1)

无论文化是什么,Decimal的价值都是一样的,

0.203

它的字符串表示(在你的情况下是小数分隔符)有什么变化,所以 如果你想改变小数点分隔符而不想改变文化 您可以在自定义NumberFormatInfo中指定 NumberDecimalSeparator ,例如

  Decimal d = 0.203M;

  NumberFormatInfo myNumberInfo = new NumberFormatInfo() {
    NumberDecimalSeparator = "," // Comma, please
  };

  String result = d.ToString(myNumberInfo); // "0,203"