C# 如何防止decimal.TryParse convert"&引用;到&引用;?
这是我的代码:C# 如何防止decimal.TryParse convert"&引用;到&引用;?,c#,parsing,C#,Parsing,这是我的代码: string myValue = "0,203"; decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal; 是否可能myValueAsDecimal在TryParse之后有0203,或者decimal的内部表示总是0.203,如果需要0203,我需要格式化GUI输出 decimal d = 0.203m; Console.WriteLine(
string myValue = "0,203";
decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal;
是否可能myValueAsDecimal
在TryParse
之后有0203,或者decimal
的内部表示总是0.203,如果需要0203,我需要格式化GUI输出
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
结果:
0,203
0.203
0.203
0,203
myValueAsDecimal是否可能在TryParse之后有0203
不,它只是一个数字,它没有文本格式的概念。考虑到另一种更简单的类型,请考虑这两行代码:
int x = 0x100;
int y = 256;
这两个值相同吗?是的,它们代表相同的数字。如果将x
和y
的值转换为字符串,默认情况下,它们都将以“256”结尾,但如果请求十六进制表示,它们都可能以“100”结尾
区分变量的实际值和文本表示很重要。很少有类型(没有我能立即想到的类型)携带关于文本表示的信息-例如,DateTime
可以从各种格式解析,但没有原始文本格式的“内存”。它只是一个日期和时间,然后可以根据任何格式格式化
如果您需要维护“十进制数及其最初表示的文化”的概念,那么您应该为该配对创建自己的类或结构。它不存在于decimal
本身中
myValueAsDecimal是否可能在TryParse之后有0203
不,它只是一个数字,它没有文本格式的概念。考虑到另一种更简单的类型,请考虑这两行代码:
int x = 0x100;
int y = 256;
这两个值相同吗?是的,它们代表相同的数字。如果将x
和y
的值转换为字符串,默认情况下,它们都将以“256”结尾,但如果请求十六进制表示,它们都可能以“100”结尾
区分变量的实际值和文本表示很重要。很少有类型(没有我能立即想到的类型)携带关于文本表示的信息-例如,DateTime
可以从各种格式解析,但没有原始文本格式的“内存”。它只是一个日期和时间,然后可以根据任何格式格式化
如果您需要维护“十进制数及其最初表示的文化”的概念,那么您应该为该配对创建自己的类或结构。它不存在于
decimal
本身中。看起来您的CurrentCulture
具有,
作为一个变量,这就是您的解析成功的原因
实际上,0.203
和0203
与值相同。唯一的问题是它们在打印时的文本表示
如果您想获得作为0203
表示的值,可以使用具有,
的区域性作为NumberDecimalSeparator
例如,我的区域性(tr
)有一个,
。用它表示小数时,将得到0203
string myValue = "0,203";
decimal myValueAsDecimal;
decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal);
myValueAsDecimal.ToString(new CultureInfo("tr-TR")).Dump(); // 0,203
看起来您的
CurrentCulture
将,
作为一个
实际上,0.203
和0203
与值相同。唯一的问题是它们在打印时的文本表示
如果您想获得作为0203
表示的值,可以使用具有,
的区域性作为NumberDecimalSeparator
例如,我的区域性(tr
)有一个,
。用它表示小数时,将得到0203
string myValue = "0,203";
decimal myValueAsDecimal;
decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal);
myValueAsDecimal.ToString(new CultureInfo("tr-TR")).Dump(); // 0,203
无论文化背景如何,
Decimal
的值都是相同的,它是
0.203
改变的是它的字符串表示形式(在您的例子中是十进制分隔符),所以
如果要更改小数点分隔符而不想更改区域性
您只需在自定义NumberFormatInfo
中指定NumberDecimalSeparator即可
Decimal d = 0.203M;
NumberFormatInfo myNumberInfo = new NumberFormatInfo() {
NumberDecimalSeparator = "," // Comma, please
};
String result = d.ToString(myNumberInfo); // "0,203"
无论文化背景如何,
Decimal
的值都是相同的,它是
0.203
改变的是它的字符串表示形式(在您的例子中是十进制分隔符),所以
如果要更改小数点分隔符而不想更改区域性
您只需在自定义NumberFormatInfo
中指定NumberDecimalSeparator即可
Decimal d = 0.203M;
NumberFormatInfo myNumberInfo = new NumberFormatInfo() {
NumberDecimalSeparator = "," // Comma, please
};
String result = d.ToString(myNumberInfo); // "0,203"
它既没有逗号也没有句点,而是存储为表示形式。数字的内部表示形式始终是二进制的。文本(人类)表示取决于您指定(或未指定)的区域性。要显示带有特定小数点的数字,必须将正确的区域性传递给ToString方法或用于格式化的其他方法。要指定一个值,您必须使用点作为小数点,因为ti是编程语言的语法。MIkroDel,我要补充的是,您可能不应该试图强制用户使用一个小数分隔符,您的应用程序应该支持他们使用的任何区域性。用户可能不熟悉不同的文化使用不同的十进制分隔符,并且肯定不会尝试用外来字符输入自己的数字separator@Sayse可以使用进行输入。或with,这两种形式都是允许的。它既没有逗号也没有句点,而是存储为表示形式。数字的内部表示形式始终是二进制的。文本(人类)表示取决于您指定(或未指定)的区域性。要显示带有特定小数点的数字,必须将正确的区域性传递给ToString方法或用于格式化的其他方法。要指定一个值,您必须使用点作为小数点,因为ti是编程语言的语法。MIkroDel,我想补充一点,您可能不应该试图强制用户使用一个十进制分隔符,您的应用程序应该支持