在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 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\")
之后,您必须替换空格,因为无法指定填充字符。或者,您可以编写自己的格式化程序以填充特定字符。这虽然有效:) 编辑:除all6 matches以外,这与所有输入的原稿都匹配。在这种情况下,原件是不正确的,因为即使它不存在,它也会将小数点作为宽度的一部分。 糟糕:忘记检查负数。 这是一个简单的版本,但必须检查数字是否为负数才能正确填充:
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\');
}
    
像这样:
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 width, 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并将其传递给您可以生成的自定义数字格式字符串。     

要回复问题请先登录注册