【问题标题】:How to remove decimals from file (round them)?如何从文件中删除小数(四舍五入)?
【发布时间】:2022-01-09 08:28:15
【问题描述】:

我必须打开文件,找到所有小数,删除小数部分,四舍五入并在文本中替换。结果文本应在控制台中打印。 我试图这样做,但我唯一做的就是删除小数部分。请告诉我如何将它们四舍五入并在结果文本中替换。这是我的代码:

Console.WriteLine("Enter path to first file:");
        String path1 = Console.ReadLine();
        
                    
        string text = File.ReadAllText(path1);
        string pattern = @"(\d+)\.\d+";
        if(File.Exists(path1) ){
            
            foreach(string phrase in Regex.Split(text, pattern)){
                Console.Write(phrase);
            }
            
        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);      
        }

【问题讨论】:

  • 您能提供您使用的文本示例吗?
  • 如果在四舍五入前去掉小数部分,就没有分数告诉你如何四舍五入了。四舍五入后,没有小数部分。
  • Aaaa 50.05 bbbb 82.52 cccc 6.8888
  • 如何在移除之前进行舍入?
  • 文件有多大,这是 csv 吗?您是要减少分配还是减少 LOH 上的分配?这需要流式传输吗?是否有任何性能限制?显然,在热门生产系统中对 1gig 文件运行正则表达式会激怒您的高级开发人员,并因所有错误的原因为您赢得奖励。

标签: c# regex rounding


【解决方案1】:

您可以使用@"\d+([\.\,]\d+)" 模式来捕获具有任意小数位数的每个数字。然后将Regex.ReplaceMatchEvaluator 一起使用,其中将捕获的值解析为double,然后通过简单的ToString("F0")“截取”小数(检查Fixed-point format)。

下面的示例包括带有逗号,. 小数分隔符的小数,借助double.TryParse 重载,我们可以指定NumberStyles.AnyCultureInfo.InvariantCulture(来自System.Globalization 命名空间)并简单替换逗号@ 987654332@点.。也适用于负数(例如 -0.98765):

var input = "I have 11.23$ and can spend 20,01 of it. "+
            "Melons cost 01.25$ per -0.98765 kg, "+
            "but my mom ordered me to buy 1234.56789 kg. "+
            "Please do something with that decimals.";
var result = Regex.Replace(input, @"\d+([\.\,]\d+)", (match) =>
    double.TryParse(match.Value.Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture, out double value)
    ? value.ToString("F0")
    : match.Value);

// Result: 
// I have 11$ and can spend 20 of it.
// Melons cost 1$ per -1 kg,
// but my mom ordered me to buy 1235 kg.
// Please do something with that decimals.

"Aaaa 50.05 bbbb 82.52 cccc 6.8888" 上也可以使用"Aaaa 50 bbbb 83 cccc 7" 的结果。

【讨论】:

    【解决方案2】:

    您可以在所有可以使用Regex.Replace 转换的匹配上使用Math.Round,并使用匹配评估器作为替代:

    var text = "Aaaa 50.05 bbbb 82.52 cccc 6.8888";
    var pattern = @"\d+\.\d+";
    var result = Regex.Replace(text, pattern, x => $"{Math.Round(Double.Parse(x.Value))}");
    Console.WriteLine(result); // => Aaaa 50 bbbb 83 cccc 7
    

    请参阅C# demo

    \d+\.\d+ 正则表达式很简单,它匹配一位或多位数字、. 和一位或多位数字。 Double.Parse(x.Value) 将找到的值转换为 Double,然后 Math.Round 将数字四舍五入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多