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
我需要十进制格式的它,所以不能使用字符串格式选项。
谢谢抢
一种选择是使用字符串操作三次:
- 将
- 原始文本解析为
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.ToDecimal
和 decimal.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 位整数开始。