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