gpt4 book ai didi

c# - 在 C# 中实现复杂数字格式的最佳方法

转载 作者:行者123 更新时间:2023-11-30 16:29:51 26 4
gpt4 key购买 nike

在 C# 中复制类似行为的最佳方法是什么?

// Converts decimal to a 0-padded string with minimum specified width and precision.
sprintf(out, "%0*.*lf", width, precision, decimal);

我读过 standard , customcomposite格式化字符串,但我看不到任何好的方法来实现这一点。

我问的原因是我刚刚在我维护的一些代码中遇到了这个丑陋的片段,我们需要根据外部接口(interface)指定的可变宽度和精度来格式化一堆小数:

private static String ZEROS = "00000000000000000000000000";

public override string Format(decimal input, int width, int precision)
{
String formatString = ZEROS.Substring(0, width - precision - 1)
+ "." + ZEROS.Substring(0, precision);
return ToDecimal(input).ToString(formatString);
}

我想用一些不那么可怕的东西来代替它。

更新

由于最终答案埋在评论中,这里是:

public override string Format(decimal input, int width, int precision)
{
string.Format("{0," + width + ":F" + precision + "}", input).Replace(" ","0");
}

在我的例子中,输入总是正的,所以这也有效:

public override string Format(decimal input, int width, int precision)
{
return input.ToString("F"+precision).PadLeft(width, 0);
}

最佳答案

你可以这样写,生成一个标准格式的字符串然后使用它:

public static string Format(decimal input, int width, int precision)
{
var format = string.Format("{{0,{0}:F{1}}}", width, precision);
// generates (e.g. width=15, precision=5) "{0,15:F5}"
// then format using this and replace padding with zeroes
return string.Format(format, input).Replace(" ", "0");
}

或者不是调用 format 两次,只是连接格式字符串,这取决于您的偏好:

string.Format("{0," + width + ":F" + precision + "}", input).Replace(" ","0")

之后您必须替换空格,因为无法指定填充字符。或者,您可以编写自己的格式化程序来填充特定字符。这虽然有效:)

编辑:这与所有输入的原始匹配,precision = 0 时除外。在这种情况下,原件是不正确的,因为即使不存在小数点,它也将小数点计为宽度的一部分。

糟糕:忘记检查负数。

这是一个更简单的版本,但必须检查数字是否为负数以获得正确的填充:

public override string Format(decimal input, int width, int precision)
{
var output = input.ToString("F" + precision);
return input < 0
? "-" + output.Substring(1).PadLeft(width, '0')
: output .PadLeft(width, '0');
}

关于c# - 在 C# 中实现复杂数字格式的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6104767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com