将固定长度数转换为十进制.NET C#

时间:2015-08-31 14:58:51

标签: c# .net

我有一个导入的txt文件,其格式为:

case class Registry(registered: Map[String, Any]) {
  def register( name: String, obj: Any ) : Registry = {
    copy( registered = this.registered + ( name -> obj) )
  }
  def unregister( name : String ) : Registry = {
    copy (registered = this.registered.filterKeys( !_.equals(name)))
  }
  // How to deal with return values????
  // Tuple return is quite ugly
  // 
  def getComponent( name: String ) : (Registry, Option[Any]) = {
    (this, registered.get( name ) )
  }
}

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

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

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

感谢。

3 个答案:

答案 0 :(得分:9)

试试这个:

 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;

答案 1 :(得分:3)

没有什么可以专门针对您的具体情况 - 特别是尾随的-非常罕见。

我只是使用这样的东西:

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

答案 2 :(得分:1)

您可以将UNIQUE与自定义格式提供商一起使用,并使用附加了减号=>的NumberFormatInfo.NumberNegativePatterndecimal.Parse

formatProvider.NumberNegativePattern = 3;

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

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

如果您想要所有小数的总和,可以使用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