我有一个导入的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-
是否有一个函数将此字符串转换为十进制并节省我的时间写一个?
感谢。
答案 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.NumberNegativePattern
。 decimal.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