Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止decimal.TryParse convert"&引用;到&引用;?_C#_Parsing - Fatal编程技术网

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,我想补充一点,您可能不应该试图强制用户使用一个十进制分隔符,您的应用程序应该支持