在转换为数字类型之前将字符串取整

时间:2019-06-07 13:36:34

标签: c# string

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

"3616,946489653802082229919075063226"

存储在string中。我想将其转换为decimal,但得到一个 OverflowException ,因为该值对于十进制而言太长了。

我想先对string进行四舍五入,然后再将其转换为来解决错误

我该怎么做?

4 个答案:

答案 0 :(得分:6)

解析是特定于文化的。因此,可以是小数或千位分隔符。如果,是千位分隔符,则会被忽略

"3616,946489653802082229919075063226" -> 3616946489653802082229919075063226m

该值超过decimal.MaxValue,因此您抛出了异常

如果将,视为小数点分隔符,请让系统知道:

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

您将获得3616.9464896538020822299190751m

答案 1 :(得分:2)

您的问题实际上不是舍入问题,它试图在系统上使用逗号来解析小数,该系统默认情况下希望将点作为小数分隔符。

您可以尝试执行此操作,以确保在所有环境中都可以对其进行正确解析:

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

https://dotnetfiddle.net/8iaL9d

答案 2 :(得分:0)

使用格式将任意单位的小数部分与小数部分隔开的小数位数给出,您可以通过以下操作来解决:

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

这有效地将其四舍五入为小数位数。

答案 3 :(得分:0)

尽管如果有人碰巧遇到了这个有名的问题,而不是寻找一种希望实际上能够将字符串四舍五入的方法,这不是您的问题,

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

这本书写得很差,我敢肯定有人可以做得更好,但是确实可以。例如,StringBuilder很伪劣,可以使其运行得更快。

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