将固定长度的数字转换为十进制.net c#

本文关键字:转换 十进制 net 数字 | 更新日期: 2023-09-27 18:10:44

我有一个导入的txt文件,编号为:

00000000003000
00000000009500
00000000003000
00000000002000
00000000000500-
00000000001500-
00000000003000-
00000000003000-
00000000009500-

这是最后两个字符为小数的数。(负值为负号)例如:

00000000003000 = 30.00
00000000000500- = -5.00

是否有一个函数将此字符串转换为十进制并节省我的时间写一个?

谢谢。

将固定长度的数字转换为十进制.net c#

试试这个:

 String source = "00000000001500-";
 Decimal result = Decimal.Parse(source, 
   NumberStyles.Any, // NumberStyles.Any includes trailing signs
   CultureInfo.InvariantCulture) / 100.0M;

如果您想要(对于某些字段,值)四位小数,只需将这些字段的100.0M更改为10000.0M:

 Decimal result4 = Decimal.Parse(source, 
   NumberStyles.Any, // NumberStyles.Any includes trailing signs
   CultureInfo.InvariantCulture) / 10000.0M;

没有特别针对您的确切场景的内容-特别是末尾的-非常不常见。

我会这样写:

public static decimal Parse(string val)
{
  return (val.EndsWith("-") ? -1M : 1M) 
         * decimal.Parse
           (
             val.Substring(0, 12) 
             + "." + val.Substring(12, 2), 
             CultureInfo.InvariantCulture
           );
}

或者,使用NumberStyles.AllowTrailingSign:

public static decimal Parse(string val)
{
  return 
    decimal.Parse
      (
        val.Substring(0, 12) 
        + "." + val.Substring(12), 
        NumberStyles.AllowTrailingSign | NumberStyles.AllowDecimalPoint, 
        CultureInfo.InvariantCulture
      );
}

您可以将decimal.Parse与自定义格式提供程序一起使用,并使用适当的NumberFormatInfo.NumberNegativePattern追加减号=> formatProvider.NumberNegativePattern = 3;:

var formatProvider = (NumberFormatInfo)NumberFormatInfo.InvariantInfo.Clone();
formatProvider.NumberNegativePattern = 3;
var numbers = File.ReadLines(yourFilePath)
    .Select(l => l.TryGetDecimal(formatProvider))
    .Where(n => n.HasValue)
    .Select(d => d.Value / 100.0M);

在LINQ查询中使用此扩展名将字符串解析为十进制:

public static decimal? TryGetDecimal(this string item, IFormatProvider formatProvider = null, NumberStyles nStyles = NumberStyles.Any)
{
    if (formatProvider == null) formatProvider = NumberFormatInfo.CurrentInfo;
    decimal d = 0m;
    bool success = decimal.TryParse(item, nStyles, formatProvider, out d);
    if (success)
        return d;
    else
        return null;
}

如果你想要所有小数的和,你可以使用Enumerable.Sum:

decimal sum = numbers.Sum(); // 0