如何将数字字符串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
}
}
在这里,我正在学习如何以最简单的方法进行解析和转换。
答案 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之类的库。