如何解决在C#中实现复杂的数字格式的最佳方法
| 在C#中复制此类行为的最佳方法是什么?// Converts decimal to a 0-padded string with minimum specified width and precision.
sprintf(out,\"%0*.*lf\",width,precision,decimal);
我读过标准,自定义和复合格式的字符串,但是看不到任何实现此目的的好方法。
我问的原因是,我只是在某些代码中碰到了这个丑陋的代码片段,我维护着这些代码,我们需要根据外部接口指定的可变宽度和精度来格式化一串小数:
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 precision)
{
string.Format(\"{0,\" + width + \":F\" + precision + \"}\",input).Replace(\" \",\"0\");
}
在我的情况下,输入始终为正,因此也可以:
public override string Format(decimal input,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 + \"}\",\"0\")
之后,您必须替换空格,因为无法指定填充字符。或者,您可以编写自己的格式化程序以填充特定字符。这虽然有效:)
编辑:除all6 matches以外,这与所有输入的原稿都匹配。在这种情况下,原件是不正确的,因为即使它不存在,它也会将小数点作为宽度的一部分。
糟糕:忘记检查负数。
这是一个简单的版本,但必须检查数字是否为负数才能正确填充:
public override string Format(decimal input,int precision)
{
var output = input.ToString(\"F\" + precision);
return input < 0
? \"-\" + output.Substring(1).PadLeft(width,\'0\')
: output .PadLeft(width,\'0\');
}
,像这样:
return input.ToString(new string(\'0\',width) + \'.\' + new string(\'0\',precision));
?
编辑:手动,这是一个更好的选择:
return input.ToString(new string(\'0\',width - 1).insert(width - precision,\'.\'));
,那么,摆脱ѭ10的一种方法是
public override string Format(decimal input,int precision)
{
String formatString = new string(\'0\',width - precision - 1)
+ \".\" + new string(\'0\',precision);
return ToDecimal(input).ToString(formatString);
}
不知道您是否还能做其他事情。
,这大约和它一样好:
public static string double2string( double value,int integerDigits,int fractionalDigits )
{
string decimalPoint = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator ;
StringBuilder sb = new StringBuilder() ;
sb.Append(\'0\',integerDigits)
.Append(decimalPoint)
.Append(\'0\',fractionalDigits)
;
return value.ToString( sb.ToString() ) ;
}
,我相信您可以调用ѭ13并将其传递给您可以生成的自定义数字格式字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。