【问题标题】:String Format Issue字符串格式问题
【发布时间】:2010-01-26 08:05:02
【问题描述】:

我有以下方法:

public static string ReturnFormat(string input, int maxLength, int decimalPrecision, char formatChar)
  {
   string[] format = new string[2];
   string[] inputs = new string[2];

   inputs = input.Split(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]);

   if (input.Length > maxLength)
   {
    int offset = 0;
    int counter = 0;

    if (inputs[0].Length > maxLength - (1 + decimalPrecision))
    {
     offset = maxLength - (1 + decimalPrecision);
    }
    else
     offset = inputs[0].Length;

    for (int i = 0; i < offset; i++)
    {
     format[0] += formatChar;

     if (counter < decimalPrecision)
     {
      format[1] += '0';
      counter++;
     }
    }

    System.Windows.Forms.MessageBox.Show("{0:" + format[0] + "." + format[1] + "}");
    return String.Format(CultureInfo.CurrentCulture, "{0:" + format[0] + "." + format[1] + "}", input);
   }
   else
    return input;
  }

说我使用的是:

ReturnFormat("12.3456789011243", 10, 2, '#') // format is {0:##.00} // output 12.3456789011243
ReturnFormat("12345678901.1243", 10, 2, '#') // format is {0:#######.00} // output 12345678901.1243

现在我的问题是输入字符串的格式不正确,但格式字符串似乎还可以。 关于我做错了什么的任何想法?

【问题讨论】:

  • 我想要的输出是 1234568.12
  • 另外,这是一个非常奇怪的格式函数,我很难弄清楚什么时候需要它。
  • 这将用于在 TextBox 中显示结果,并且 TextBox 它相当小,结果不适合用户的视觉范围。我的意思是 TextBox 可以存储大量值,但用户将无法看到正确的结果,而且文本框也是只读的。
  • 那么我建议您在开始缩短整数部分之前删除小数。我认为这种缩短方式会让用户非常困惑,而且实际上是完全错误的。
  • 好的,所以基本上我正在研究转换器,并且我有一个关于数字精度的选项。当我从单位 A 转换为单位 B 时,结果类似于 12345678901.1243 现在如果精度设置为 2,则转换后的值最多应包含 2 位数字。在我的情况下,数字是 12345678901.1243,这意味着 1234567890 并且 NumberDecimalSeparator 之后没有值。那将是正确的,因此只有像 12.3456789011243 这样的值将被处理为 12.35)对不起我的英语。我不确定我的解释是否正确。

标签: string c#-2.0


【解决方案1】:

您的输入是 String 而不是 Double,因此它的格式类似于字符串:在这种情况下,格式不知道小数位。

您可以使用 Double.Parse() 将字符串转换为 Double 值,但请注意使用正确的文化。

另外,在这两种情况下不使用更自然的格式 {0:0.00} 是否有特定原因?如果你真的想为数字使用占位符,那么 # 是可以的,否则 0 是最好的。

经过测试的解决方案(注意它会被截断并且不会四舍五入)我需要一些时间来了解真正想要的是什么:

public static string ReturnFormat(string input, int maxLength, int decimalPrecision)
{
    if (input.Length <= maxLength)
        return input;
    Char separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
    string[] inputs = input.Split(separator);
    // NB: truncating rather than rounding
    if (inputs[1].Length > decimalPrecision)
        inputs[1] = inputs[1].Substring(0, decimalPrecision);
    int digits = (maxLength - decimalPrecision - 1);
    // NB: truncating rather than rounding, adding ~ to signalize the
    // presence of missing significant digits
    if (inputs[0].Length > digits)
        inputs[0] = inputs[0].Substring(0, digits-1) + "~";
    return inputs[0] + separator + inputs[1];
}

【讨论】:

  • 好的,所以我使用了 Double.Parse(),它在第一种情况下工作正常(12.3456789011243 返回 12.35)但在第二种情况下不能正常工作(12345678901.1243 返回相同)仍然,格式我猜在第二种情况下( {0:#######.00} )没问题。
  • # 是占位符,这是一个陷阱,请参阅我的备忘单color-of-code.de/…
  • 如有其他有关格式的问题或 cmets,请随时与我联系,我会尽量保持该表是最新的。我认为你会更喜欢 0.00 作为格式字符串,而不是进行复杂的格式字符串计算。
  • 问题是我需要以固定长度显示一个值,这就是我尝试使用它的原因。因为在我的情况下必须以固定长度显示一个值,所以我不能使用 0.00 :(
  • 您是否知道您实际上是在更改值但仍保留小数点?看起来很腥。
猜你喜欢
  • 2014-10-23
  • 2023-01-12
  • 2013-05-13
  • 2018-11-07
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多