格式化字符串以显示自定义小数值

时间:2013-12-30 17:21:09

标签: c# string format devexpress

我正在尝试正确格式化一些双打,以便它们能够正确显示我的用途(我在Devexpress中构建一个语句,所以我正在使用大量数字)。

以下是我希望发生的基本格式规则:

1000.2  -> 1,000.20
1000    -> 1,000
1000.22 -> 1,000.22

这是否可以在C#中使用字符串格式?我尝试了以下方法,但未能实现我的目标:

#,#.## - gives me 1,000.2 for the first value
#,#.#0 - gives me 1,000.00 for the second value
#,#.00 - gives me 1,000.00 for the second value

编辑:更多信息。 DevExpress使我能够在绑定到报表后使用字符串格式设置值。我们在报告时这样做(而不是在幕后代码的计算时间),因为我们在DevExpress为我们提供的表中使用Sum函数。我们这样做的原因是我们可以通过一次大量数据来最小化对数据库的调用,然后在语句中反复使用该表并根据内部的限制进行过滤。

编辑编辑: 根据我在评论中收到的反馈,我不可能只提供字符串格式来执行格式化操作;我需要在向报表提供数据时插入一些代码(然后从报表中删除任何和所有格式)并在代码级执行所有求和函数(以确保总和值具有预期的小数位) ,或者我需要接受.00结尾,例如,一些日元(100日元永远不会表示为100。00日元,作为一个例子)。

这是一个深奥的案例,但很高兴知道!

6 个答案:

答案 0 :(得分:1)

为什么不在使用普通旧C#绑定到DevExpress控件之前格式化值(假设您正在执行绑定,因为您没有提供足够的详细信息。)

c#中,Math.Round()应该可以解决问题。

示例Math.Round(doubleValue,2),其中第二个参数是小数位数。

编辑:

<强>#,## 0.00

我没有DevExpress控件来测试我的解决方案,但我确实在线找到http://documentation.devexpress.com/#windowsforms/CustomDocument1498(不确定你是否已经看到它)。

您似乎可以使用NumberCurrency面具。

另请查看自定义部分下的Zero Placeholder。基于描述,在用户未提供值的情况下填充“0”。

示例:123.4 - &gt; 123.40

答案 1 :(得分:1)

调用ToString()时,使用“N”格式说明符作为格式字符串;见here

例如:

int intValue = 123456789;
Console.WriteLine(intValue.ToString("N2", 
    CultureInfo.InvariantCulture).Replace(".00", "");

您可以根据需要自定义组大小等。

答案 2 :(得分:1)

您可以使用与简单if条件相关联的字符串格式。为了缩短它的使用,您还可以将其作为Extension方法。它看起来像这样:

public static string FormatConditionnaly(this double input)
{
    return input % 1 == 0 ? input.ToString("#,0") : input.ToString("#,0.00");
}

基本上,如果您的数字不包含任何小数(% 1 == 0检查),则将其格式化为不带小数。如果检查失败,则添加两个零。

它的使用方式如下:

const double flatNumber = 1000;
string result1 = flatNumber.FormatConditionnaly(); //1,000

const double numberWithDecimals = 1000.5;
string result2 = numberWithDecimals.FormatConditionnaly(); //1,000,50

答案 3 :(得分:1)

有点黑客但是你可以尝试一下:

s = String.Format("{0:N2}", 1000).Replace(".00", "");

答案 4 :(得分:1)

如果您尝试格式化的字符串位于XRTableCell实例的XtraReport中,则可以处理该单元格上的BeforePrint事件以格式化其文本。只要呈现报告,就会触发此事件。调用GetCurrentColumnValue以检索要格式化的值,使用之前适用于您的答案中的任何代码方法,然后使用格式化字符串设置该单元格的文本。使用@ dweeberly的回答:

private void OnBeforePrint(object sender, PrintEventArgs e)
{
   object value = this.GetCurrentColumnValue("YourField");
   if (value != null)
   {
       yourCell.Text = String.Format("{0:N2}", value.ToString()).Replace(".00", "");
   }
}

答案 5 :(得分:0)

根据我在评论中收到的反馈,我不可能只提供字符串格式来执行我想要的格式化;我需要在向报表提供数据时插入一些代码(然后从报表中删除任何和所有格式)并在代码级执行所有求和函数(以确保总和值具有预期的小数位) ,或者我需要接受.00结尾,例如,一些日元(100日元永远不会表示为100。00日元,作为一个例子)。

这是一个深奥的案例,但很高兴知道!