Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用精度和比例将字符串转换为十进制_C#_.net - Fatal编程技术网

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

C# 使用精度和比例将字符串转换为十进制,c#,.net,C#,.net,是否有任何辅助方法可以将字符串转换为十进制,并动态设置格式 大概是这样的: var myNumber = decimal.Parse(myString, precision, scale); 例如: 原始问题 我正在从具有固定长度的文件中读取值: 样本行: 004574575434768743486765025448754546746485678696854745646874 为此,我使用FileHelpers,但每个值都有不同的精度/比例: Amount1 (pos0-pos16) - p

是否有任何辅助方法可以将字符串转换为十进制,并动态设置格式

大概是这样的:

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

原始问题

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

样本行:

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

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

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

您可以使用
System.Data.SqlTypes.SqlDecimal
进行此操作

System.Data.SqlTypes.SqlDecimal.ConvertToPrecScale(SqlDecimal.Parse(yourString), 9, 6); // params: SqlDecimal n, int precision, int scale
这是我的建议

要获取
十进制
,可以使用
SqlDecimal.Value

如果使用
ConvertToPrecScale
它会抛出

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

快速示例:

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
            );
    }
}

不清楚您在这里要求的是什么-部分原因是您要求的是十进制,但给出了一个带有
Convert.ToDouble
的示例,部分原因是您没有给出任何示例说明您的意思。示例输入和预期输出——以及您迄今为止所尝试的内容——将更容易帮助您。
decimal m=Math.Round(Convert.ToDecimal(myString),6);//6=x.xxxxxx
对不起。。。那里有个打字错误。。。put convert而不是decimal.parse您可以在此处使用scale和precision属性。我怀疑您遇到了另一个问题,并认为使用precision/scale定义十进制是解决方案。NET的小数没有可变的精度/小数位数。你想干什么?您试图解决的原始问题是什么?这将向Sql Server客户端添加依赖项,并导致代码速度相当慢。@PanagiotisKanavos当然会,但OP询问是否有方法将字符串转换为十进制。没有给出进一步的信息,所以这是一个有效的解决方案,确切的问题是关于System.Decimal,它根本不支持缩放。另一方面,问题的示例根本不进行十进制解析。它尝试使用
var valor=“12345”将整数字符串转换为十进制字符串
valor.ToDecimal(5,2)
得到12345的值
decimal.Parse(“123.45”)
返回12345值。有关“,”和“.”的文化问题,如小数分隔符和GroupSeparator@Kiquenet字符串的长度总是已知的,因为这是一个扩展方法。出现您提到的问题是因为十进制分隔符在某些文化中为“.”,而在其他文化中为“.”;但是,现在更新了答案以处理该情况。
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