使用精度和比例将字符串转换为十进制

时间:2016-03-24 11:03:01

标签: c# .net

是否有任何帮助方法将字符串转换为十进制设置动态格式?

这样的事情:

var myNumber = decimal.Parse(myString, precision, scale);

例如:

myString: "0109123456"
precision: 9
scale: 6
output: 109.123456

原始问题

我正在从具有固定长度的文件中读取值:

示例行:

004574575434768743486765025448754546746485678696854745646874

为此我正在使用FileHelpers,但每个值都有不同的精度/比例:

Amount1 (pos0-pos16) - precision: 15, scale: 2
Amount1 (pos17-pos25) - precision: 7, scale: 3

FileHelpers获取我确定的范围内的值,但之后我需要转换它。

2 个答案:

答案 0 :(得分:3)

快速举例:

public static class stringExtension
{
    public static decimal ToDecimal(this string s, int precision, int scale)
    {
        if (s.Length < precision)
            throw new ArgumentException();
        return decimal
            .Parse(
            s.Substring(s.Length - precision)
            .Insert(precision - scale, ".")
            .ToString()
            ,
            System.Globalization.NumberStyles.AllowDecimalPoint,
            System.Globalization.NumberFormatInfo.InvariantInfo
            );
    }
}

使用:

        string s = "0109123456";
        decimal d = s.ToDecimal(9, 6); // returns 109.123456M

答案 1 :(得分:1)

您可以将System.Data.SqlTypes.SqlDecimal用于此

System.Data.SqlTypes.SqlDecimal.ConvertToPrecScale(SqlDecimal.Parse(yourString), 9, 6); // params: SqlDecimal n, int precision, int scale

这里是MSDN-link

要获得decimal,您可以使用SqlDecimal.Value

如果您使用ConvertToPrecScale它会抛出SqlTruncateException

,请务必小心
  

将值设置为a时引发的异常   System.Data.SqlTypes中