Short.Parse与十进制失败

时间:2016-10-26 10:59:17

标签: c# tryparse

我有一个小数值

decimal myDecimal = 19.0000M;

我试图将其转换为短值。

short newVal;
short.TryParse(myDecimal.ToString(), out newVal); // False

但这失败了。如果我使用双倍,那很好。

为什么这会失败?

由于

6 个答案:

答案 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"
  

修复

为了能够解析原始输入,请使用提供NumberStyleFormat的重载:

var succeeded = short.TryParse(myDecimal.ToString(), NumberStyles.Number, NumberFormatInfo.CurrentInfo,  out newVal);

NumberStyle.Number允许:

  • AllowLeadingWhiteAllowTrailingWhiteAllowLeadingSignAllowTrailingSignAllowDecimalPointAllowThousands

答案 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);