短.使用十进制进行解析失败

本文关键字:失败 十进制 | 更新日期: 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"

修复

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

var succeeded = short.TryParse(myDecimal.ToString(), NumberStyles.Number, NumberFormatInfo.CurrentInfo,  out newVal);
NumberStyle.Number允许:
  • AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSignAllowTrailingSign, 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);