C# 在转换为数字类型之前对字符串进行四舍五入

C# 在转换为数字类型之前对字符串进行四舍五入,c#,string,C#,String,我有一个数字(只是一个例子: "3616,946489653802082229919075063226" 存储在字符串中。我想将其转换为十进制,但得到一个OverflowException,因为该值对于十进制太长 在转换字符串以修复错误之前,我想对其进行四舍五入 如何执行此操作?解析是特定于区域性的。因此,可以是十进制分隔符或千位分隔符。如果,是千位分隔符,则将忽略它: 这个值超过了decimal.MaxValue,所以抛出了异常 如果,应被视为十进制分隔符,请告知系统: decimal re

我有一个数字(只是一个例子:

"3616,946489653802082229919075063226"
存储在
字符串中
。我想将其转换为
十进制
,但得到一个OverflowException,因为该值对于十进制太长

在转换
字符串以修复错误之前,我想对其进行四舍五入


如何执行此操作?

解析是特定于区域性的。因此,
可以是十进制分隔符或千位分隔符。如果
是千位分隔符,则将忽略它:

这个值超过了decimal.MaxValue,所以抛出了异常

如果
应被视为十进制分隔符,请告知系统:

decimal result = decimal.Parse(source, 
  new NumberFormatInfo() { NumberDecimalSeparator = ","});

您将得到
3616.9464896538020822299190751m

您的问题实际上不是一个取整问题,而是试图在一个系统上解析一个带逗号的小数,该系统默认使用点作为小数分隔符

您可以尝试这样做,以确保在所有环境中都能很好地解析它:

using System;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        var input = "3616,946489653802082229919075063226";
        var result = decimal.Parse(input, new NumberFormatInfo() { NumberDecimalSeparator = ","});
        Console.WriteLine(result);
    }
}

给定任意数量的小数位数,格式中用逗号分隔单位和小数部分,您可以通过执行以下操作来解决此问题:

class Program
{
    static void Main(string[] args)
    {
        var decimalPlacesCount = 10;
        var decimalSeparator = ',';
        var parts = "3616,946489653802082229919075063226".Split(decimalSeparator);
        var value = decimal.Parse(parts[0]);
        if (parts.Length == 2)
        {
            value += decimal.Parse($"0.{parts[1].Substring(0, decimalPlacesCount)}");
        }
        Console.WriteLine(value);
    }
}

这有效地将其舍入到DecimalPlaceScont中。

虽然这不是您的问题,但如果有人偶然发现这个名称很好的问题,正在寻找一个能够将字符串舍入的方法,希望下面的内容会有所帮助

    public static string RoundString(string value, int decimalPlaces)
    {
        StringBuilder returnValue = new StringBuilder(value);

        int startIndex = 0;

        int charIndex = 0;
        while (charIndex < value.Length && startIndex == 0)
        {
            if (value[charIndex].ToString() == ".")
                startIndex = charIndex + 1;

            charIndex++;
        }

        if (int.Parse(value[charIndex + decimalPlaces + 1].ToString()) >= 5)
        {
            bool rounded = false;
            for (charIndex = startIndex + decimalPlaces; charIndex > -1; charIndex--)
            {
                if (!rounded && charIndex != startIndex-1)
                { 
                    int newVal = int.Parse(returnValue[charIndex].ToString()) + 1;
                    if (newVal > 9)
                    {
                        returnValue[charIndex] = '0';
                    }
                    else
                    {
                        returnValue[charIndex] = (int.Parse(returnValue[charIndex].ToString()) + 1).ToString()[0];
                        rounded = true;
                    }
                }
            }
            if (!rounded)
            {
                startIndex++;
                returnValue = new StringBuilder("1" + returnValue.ToString());
            }
        }

        return returnValue.ToString().Substring(0, startIndex + decimalPlaces);
    }
公共静态字符串RoundString(字符串值,整数小数点)
{
StringBuilder returnValue=新的StringBuilder(值);
int startIndex=0;
int charIndex=0;
while(charIndex=5)
{
布尔四舍五入=假;
对于(charIndex=startIndex+decimalPlaces;charIndex>-1;charIndex--)
{
如果(!rounded&&charIndex!=startIndex-1)
{ 
int newVal=int.Parse(返回值[charIndex].ToString())+1;
如果(newVal>9)
{
returnValue[charIndex]=“0”;
}
其他的
{
returnValue[charIndex]=(int.Parse(returnValue[charIndex].ToString())+1.ToString()[0];
四舍五入=真;
}
}
}
如果(!四舍五入)
{
startIndex++;
returnValue=新的StringBuilder(“1”+returnValue.ToString());
}
}
返回returnValue.ToString().Substring(0,startIndex+decimalPlaces);
}
它写得很差,我相信有人可以做得更好,但它确实做得很好。例如,StringBuilder相当劣质,可能会让它运行得更快


另外,我对实际的输入字符串进行0验证。

你试过了吗?请提供你的代码。如果你卡住了,它会帮助你,但它不是一个提供代码的服务。你如何转换它?
Decimal.Parse(“3616.946489653802082229919075063226”)
在我的机器上工作,而
Decimal.Parse(“361694648965380822299075063226”)
给我一个
格式异常
,因为
被解释为千分位符,但是
溢出异常
不在卡片中。我尝试使用
Convert.ToDecimal(“…”)转换您的样本
并且它正确地转换了它。我只得到一个
溢出异常
,当这个数字对于
十进制
来说太大时,
十进制结果=decimal.Parse(源代码,new NumberFormatInfo(){NumberDecimalSeparator=“,”);
@NicoSchreiner你的应用程序中可能有不同的区域设置吗?
    public static string RoundString(string value, int decimalPlaces)
    {
        StringBuilder returnValue = new StringBuilder(value);

        int startIndex = 0;

        int charIndex = 0;
        while (charIndex < value.Length && startIndex == 0)
        {
            if (value[charIndex].ToString() == ".")
                startIndex = charIndex + 1;

            charIndex++;
        }

        if (int.Parse(value[charIndex + decimalPlaces + 1].ToString()) >= 5)
        {
            bool rounded = false;
            for (charIndex = startIndex + decimalPlaces; charIndex > -1; charIndex--)
            {
                if (!rounded && charIndex != startIndex-1)
                { 
                    int newVal = int.Parse(returnValue[charIndex].ToString()) + 1;
                    if (newVal > 9)
                    {
                        returnValue[charIndex] = '0';
                    }
                    else
                    {
                        returnValue[charIndex] = (int.Parse(returnValue[charIndex].ToString()) + 1).ToString()[0];
                        rounded = true;
                    }
                }
            }
            if (!rounded)
            {
                startIndex++;
                returnValue = new StringBuilder("1" + returnValue.ToString());
            }
        }

        return returnValue.ToString().Substring(0, startIndex + decimalPlaces);
    }