如何将数字字符串解析为十进制并将其转换回字符串而不会造成任何损失?

时间:2018-12-28 19:43:34

标签: c#

如何将数字字符串input解析为十进制number并将其转换回字符串而不会造成任何损失?

using System;
using System.Globalization;


class Program
{
    static void Main(string[] args)
    {
        string input = "-1.234.567.890,123456789012345678901234567890";
        var ci = new CultureInfo("id-ID");

        decimal number = decimal.Parse(input, NumberStyles.Number, ci);
        string output = number.ToString("N", ci);

        Console.WriteLine(output == input);// produces False

    }
}

在这里,我正在学习如何以最简单的方法进行解析和转换。

2 个答案:

答案 0 :(得分:2)

创建了一个MyType类来保存您的数字并将输入分为两个不同的部分。

如果计划将这些数字用于算术,则可能会遇到麻烦。您可能必须重载算术运算并实现自己的运算。

public static void Main()
{
    // Mine
    string input = "-1.234.567.890,123456789012345678901234567890";
    string left = input.Split(',')[0].Replace(".", string.Empty);
    string right = input.Split(',')[1];

    MyType myInput = new MyType(
        int.Parse(left, System.Globalization.NumberStyles.AllowLeadingSign), 
        BigInteger.Parse(right, System.Globalization.NumberStyles.AllowLeadingSign));

    Console.WriteLine(input);
    Console.WriteLine(myInput);

    Console.WriteLine(input == myInput.ToString());

    // Yours
    string input2 = "-1.234.567.890,123456789012345678901234567890";
    var ci = new CultureInfo("id-ID");

    decimal number = decimal.Parse(input2, NumberStyles.Number, ci);
    string output = number.ToString("N", ci);

    Console.WriteLine(input2);
    Console.WriteLine(output);
    Console.WriteLine(output == input2);// produces False
}

public class MyType
{
    public int whole;
    public BigInteger deci;

    public MyType(int whole, BigInteger deci)
    {
        this.whole = whole;
        this.deci = deci;
    }

    public override string ToString()
    {
        return string.Format("{0},{1}", string.Format("{0:#,####}", whole)
                     .Replace(',' ,'.'), deci);
    }
}

// Mine
-1.234.567.890,123456789012345678901234567890
-1.234.567.890,123456789012345678901234567890
True
// Yours
-1.234.567.890,123456789012345678901234567890
-1.234.567.890,12
False

答案 1 :(得分:1)

decimal can store only up to 28-29 significant digits

对于具有更多数字的数字,您可以尝试使用BigFloat或BigDecimal之类的库。