C# 将字符串转换为十进制 4dp

本文关键字:十进制 4dp 转换 字符串 | 更新日期: 2023-09-27 18:31:16

我需要获取一个字符串对象并将其转换为十进制数到 4 dp。

所以例如:

string val = "145.83011";
decimal sss = Math.Round(Convert.ToDecimal(val), 4);

带回 145.8301 - 好

然而:

string val = "145.8300";
decimal sss = Math.Round(Convert.ToDecimal(val), 4);

带回 145.83我需要它是 145.8300

我需要十进制格式的它,所以不能使用字符串格式选项。

谢谢抢

C# 将字符串转换为十进制 4dp

一种选择是使用字符串操作三次:

  • 原始文本解析为decimal值(这将保留原始小数位数)
  • 使用字符串格式以正有 4 位小数的字符串结束。(Math.Round确保最多有 4DP,但不完全是 4DP。
  • 解析格式化结果以返回到具有精确 4DP 的decimal值。

所以像这样:

public static decimal Force4DecimalPlaces(string input)
{
    decimal parsed = decimal.Parse(input, CultureInfo.InvariantCulture); 
    string intermediate = parsed.ToString("0.0000", CultureInfo.InvariantCulture);
    return decimal.Parse(intermediate, CultureInfo.InvariantCulture);
}

我不愿使用这样的字符串转换,但替代方案相对棘手。你可以得到原始位,拆分不同的部分找到尾数和比例,然后适当调整......或者,您可以计算出一些算术运算序列以达到正确的比例。(Jeppe 乘以 1.0000m 的方法很可能是完全正确的——我只是不知道它是否被记录在案是正确的。至少值得为您期望看到的各种数字添加适当的测试。

请注意,据我所知,上面的代码将四舍五入,因此例如 1.12345 将转换为 1.1235。

注释中带有输出的示例:

using System;
using System.Globalization;
class Test
{
    static void Main()        
    {
        Console.WriteLine(Force4DecimalPlaces("0.0000001")); // 0.0000
        Console.WriteLine(Force4DecimalPlaces("1.000000"));  // 1.0000
        Console.WriteLine(Force4DecimalPlaces("1.5"));       // 1.5000
        Console.WriteLine(Force4DecimalPlaces("1.56789"));   // 1.5679
    }
    public static decimal Force4DecimalPlaces(string input)
    {
        decimal parsed = decimal.Parse(input, CultureInfo.InvariantCulture); 
        string intermediate = parsed.ToString("0.0000", CultureInfo.InvariantCulture);
        return decimal.Parse(intermediate, CultureInfo.InvariantCulture);
    }
} 

Convert.ToDecimaldecimal.Parse 都会在字符串中保留尾随零(一个System.Decimal总共最多可以有 28-29 位数字,因此在大多数情况下,仍然有空间容纳所有尾随零)。

并且Math.Round(..., 4)保留尾随零,直到小数点后的第四位。

因此,这个问题的前提是错误的。你的榜样确实带回了你想要的。

在任何情况下,请考虑指定接受IFormatProvider的重载,并将CultureInfo.InvariantCulture作为参数。然后,转换独立于当地文化。

相反,如果要处理像"145.83"这样的字符串并附加不在字符串中的尾随零,请使用:

string val = "145.83";
decimal sss = Math.Round(
    decimal.Parse(val, CultureInfo.InvariantCulture) * 1.0000m,
    4);

尾声:如果您不喜欢像1.0000m这样的数字乘除,请使用decimal.GetBits来获取内部表示。通过乘以或除以十的适当幂来调整整数"部分",并通过减去或添加相应的数字来调整刻度"部分"。刻度计算将小数点向左移动的位数,从 96 位整数开始。