我有一个小数值
decimal myDecimal = 19.0000M;
我试图将其转换为短值。
short newVal;
short.TryParse(myDecimal.ToString(), out newVal); // False
但这失败了。如果我使用双倍,那很好。
为什么这会失败?
由于
答案 0 :(得分:4)
包括文化和数字风格将是更好的方法:
short.TryParse(myDecimal.ToString(), NumberStyles.Integer | NumberStyles.AllowDecimalPoint,
System.Globalization.CultureInfo.InvariantCulture, out newVal);
答案 1 :(得分:2)
问题
问题是TryParse
的这个重载将该数字视为
NumberStyles.Integer
- 意味着它正在寻找一种格式
不包含任何.
。在Reference Source中看到它
实际上这样做:
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 work 但 decimal失败
使用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
答案 2 :(得分:1)
你应该AllowDecimalPoint
解析short,在其他情况下解析会失败:DonNetFiddle
decimal myDecimal = 19.0000M;
short newVal;
short.TryParse(myDecimal.ToString(), NumberStyles.AllowDecimalPoint , CultureInfo.InvariantCulture, out newVal);
答案 3 :(得分:0)
请记住,小数也会在浮点后保存数字。因此,数学上相等的数字会在打印时产生不同的效果:
decimal myDecimal = 19.0000M;
decimal myDecimal2 = 19.000000M;
Console.WriteLine(myDecimal.ToString());
Console.WriteLine(myDecimal2.ToString());
//OUTPUT
19,0000
19,000000
答案 4 :(得分:0)
它不起作用,因为myDecimal.ToString()返回一个十进制数字符串:19.000和short.Tryparse()只接受整数字符串。
解决方案不是转换为字符串,而是直接在decimal和short之间(如luki所示):
short shortVal = Convert.ToInt16(myDecimal);
答案 5 :(得分:-1)
尝试: Convert.ToInt16(myDecimal);