【问题标题】:C# Convert decimal to string with specify formatC# 将十进制转换为指定格式的字符串
【发布时间】:2016-12-19 01:49:10
【问题描述】:

我需要将十进制数 a 转换为字符串 b 如下:

  • b 必须是避风港'.' 字符。例如:
    • a = 12 -> b = "12.0"
    • a = 1.2 -> b = "1.2"
    • a = 1.234 -> b = "1.234"

我怎样才能用 1 个命令做到这一点?

  • b 必须正好有 10 个字符。例如:
    • a = 101 -> b = "101.000000"
    • a = 1.234 -> b = "1.23400000"
    • a = 1.234567891 -> b = "1.23456789"

(与 1 相同的问题)

【问题讨论】:

  • 知道如何 google(搜索)?在提问之前先做。

标签: c# string math decimal


【解决方案1】:
decimal a = 12;
var b = a.ToString("N1"); // 12.0

a = 1.2m;
b = a.ToString(); // 1.2

a = 101m;
b = a.ToString("N10"); // 101.0000000000

a = 1.234m;
b = a.ToString("N10"); // 1.2340000000

对于您问题的第二部分 - 您希望总长度为 10,那么:

decimal a = 1.234567891m;
int numberOfDigits = ((int)a).ToString().Length;
var b = a.ToString($"N{9 - numberOfDigits}"); //1.23456789

//Or before C# 6.0
var b = a.ToString("N" + (9 - numberOfDigits)); //1.23456789

基本上((int)number).ToString().Length 为您提供. 之前的位数(转换为int 将删除分数),然后从. 之后的位数中减少它(小数点也为-1本身)

【讨论】:

  • 第二题中,b 的总字符数为 10,而不是 '.' 后的位数
  • 第2个,总长度>10时需要考虑,第2个可能需要扩展方法。
  • @GiladGreen 十进制 a = 12345678910m 怎么样?
【解决方案2】:

您可以使用.ToString() 来执行此任务:

decimal aDecimalVal = 10.234m;
string decimalString = aDecimalVal.ToString("#.000"); // "10.234"
aDecimalVal.ToString("#.00"); // "10.23"
aDecimalVal.ToString("#.0000"); // "10.2340"

格式字符串中.后面的0的个数将决定十进制字符串的位数。

更新:所以你想找到小数点后的位数,所以代码中的变化如下:

decimal aDecimalVal = 10.2343455m;
int count = BitConverter.GetBytes(decimal.GetBits(aDecimalVal)[3])[2];
string formatString = String.Format("N{0}",count.ToString());
string decimalString = aDecimalVal.ToString(formatString); // "10.2343455"

【讨论】:

  • 但我不知道 '.' 后面的确切位数字符
【解决方案3】:

我设法使用双精度来做到这一点。这是你需要的吗? 我不太明白你问题的第二部分。

double a = 12;
string b = a.ToString("0.0000000000######");
Console.WriteLine(b);

【讨论】:

    【解决方案4】:

    对于第一个,如果你不知道变量可能是多少位,你可以有一个扩展方法:

    public static string ToSpecificFormat(this decimal value)
    {
        var count = BitConverter.GetBytes(decimal.GetBits(value)[3])[2];
        return value.ToString(count == 0 ? "N1" : "N" + count);
    }
    

    这将确保输出中至少有 1 个数字。

    对于第二个,如果数字 > 1000000000,则所选答案将失败。这个应该可以:

    public static string ToFixedLength(this decimal value)
    {
        if (value >= 1000000000m) return value.ToString("N0");
        
        var format = 9 - Math.Floor(value).ToString().Length;
        return value.ToString("N" + format);
    }
    

    输出:

    1.234m.ToFixedLength(); // 1.23400000
    101m.ToFixedLength(); // 101.000000
    123456789123m.ToFixedLength(); // 123,456,789,123
    

    【讨论】:

      【解决方案5】:

      如果您希望结果为字符串,只需对其进行解析并将其格式化为小数点后一位:

      string strTemp = 12;
      double temp = Double.Parse(strTemp, CultureInfo.InvariantCulture);
      string result = temp.ToString("N1", CultureInfo.InvariantCulture);
      

      四舍五入到小数点后两位,例如。 27.658 => 27.66

      确保始终保留 2 位小数,例如。 12 => 12.00, 12.5 => 12.50

      非常适合货币金额。

      strTemp.ToString("F");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-08
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 2013-05-21
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        相关资源
        最近更新 更多