这是我的代码:
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输出吗?
答案 0 :(得分:6)
在TryParse
之后,myValueAsDecimal是否有0,203
没有。它只是一个数字 - 它没有文本格式的概念。要用更简单的类型来考虑另一种方法,请考虑以下两行代码:
int x = 0x100;
int y = 256;
这两个值是否相同?是的,它们代表相同的数字。如果将x
和y
的值转换为字符串,默认情况下它们最终都会变为“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"