短.使用十进制进行解析失败
本文关键字:失败 十进制 | 更新日期: 2023-09-27 18:15:04
我有一个十进制值
decimal myDecimal = 19.0000M;
我正在尝试将其转换为短值。
short newVal;
short.TryParse(myDecimal.ToString(), out newVal); // False
但是这失败了。如果我使用双精度,它是好的。
为什么会失败?
谢谢
包括文化和数字样式将是更好的方法:
short.TryParse(myDecimal.ToString(), NumberStyles.Integer | NumberStyles.AllowDecimalPoint,
System.Globalization.CultureInfo.InvariantCulture, out newVal);
的问题
-
问题是
TryParse
的过载将该数字作为一个NumberStyles.Integer
-这意味着它正在寻找一个格式不含.
。参见参考源代码实际操作:public static bool TryParse(String s, out Int16 result) { return TryParse(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result); }
-
显示
.
是问题,变化如下,它将工作:decimal myDecimal = 19M; var succeeded = short.TryParse(myDecimal.ToString(), out newVal);
双十进制
使用double的原因是因为它在ToString
中的返回方式:
decimal val1 = 19.00M;
double val2 = 19.00;
val1.ToString() // "19.00"
val2.ToString() // "19"
修复
为了能够解析您的原始输入,请使用您提供NumberStyle
和Format
的重载:
var succeeded = short.TryParse(myDecimal.ToString(), NumberStyles.Number, NumberFormatInfo.CurrentInfo, out newVal);
NumberStyle.Number
允许:
-
AllowLeadingWhite
,AllowTrailingWhite
,AllowLeadingSign
,AllowTrailingSign
,AllowDecimalPoint
,AllowThousands
您应该使用解析短的AllowDecimalPoint
,否则解析将失败:DonNetFiddle
decimal myDecimal = 19.0000M;
short newVal;
short.TryParse(myDecimal.ToString(), NumberStyles.AllowDecimalPoint , CultureInfo.InvariantCulture, out newVal);
记住,小数也保存浮点数之后的数字。因此,数学上相等的数字在打印时将产生不同的效果:
decimal myDecimal = 19.0000M;
decimal myDecimal2 = 19.000000M;
Console.WriteLine(myDecimal.ToString());
Console.WriteLine(myDecimal2.ToString());
//OUTPUT
19,0000
19,000000
它不能工作,因为myDecimal.ToString()返回一个十进制数字string: 19.000,而short.Tryparse()只接受整数字符串。
解决方案不是转换为字符串,而是直接在十进制和短格式之间转换(如luki所示):
尝试:Convert.ToInt16 (myDecimal);